当前位置: 首页 > 知识库问答 >
问题:

如何通过Eclipse和SpringBoot编写mapstruct映射器的JUnit5测试

太叔豪
2023-03-14

基本上,我只是想测试我的映射器,它应该是由MapStruct自动生成的。

我尝试了所有可能的注释,这个答案似乎是使用sprinboot和JUnit5的最佳解决方案,尽管它在我的eclipse中仍然不起作用,不知为什么它只是显示了一个如下所示的错误,即ProductMapperImpl不能解析为type尽管它应该通过@mapper注释自动生成。例如,我也在使用Lombok注释和所有这些自动生成的方法,eclipse都能识别并工作得非常好。

那我做错了什么?也许还有另一种方法可以将映射器接口自动连接到测试类,这样它就可以工作了?也许它与生成的资源文件夹有关,而只是eclipse不知何故没有识别它?

测试类

@Slf4j
@SpringBootTest(classes = { ProductMapperImpl.class })
class ProductMapperTest {

  @Autowired
  private ProductMapper productMapper;

  @BeforeAll
  public static void setup() {
    log.info("Testing mapper between product entity and product dto...");
  }

  @Test
  public void test() {
    String hello = "Hello";
    assertTrue("Hello".equals(hello));
  }

  @Test
  public void shouldMapProductToDto() {
    // given
    User user1 = new User("username_1", "1", Role.STORE);
    RetailStore store1 = new RetailStore(user1, "store", "1234", "store@example.org");
    Category cat1 = new Category("vegetables");
    Product entity = new Product(cat1, "cucumber", new BigDecimal(0.99), store1);
    // when
    System.out.println(entity);
    ProductDto dto = productMapper.productToProductDto(entity);
    // then
    assertNotNull(dto);
    assertEquals(dto.getCategoryName(), entity.getCategory().getCatName());
    assertEquals(dto.getName(), entity.getName());
    assertEquals(dto.getPrice(), entity.getPrice());
    assertEquals(dto.getProductId(), entity.getProductId());
    assertEquals(dto.getStoreId(), entity.getRetailStore().getStoreId());
  }

  @Test
  public void shouldMapDtoToProduct() {
    // given
    ProductDto dto = new ProductDto();
    dto.setCategoryName("vegetables");
    dto.setDescription("description");
    dto.setLimitations("limitations");
    dto.setName("cucumber");
    dto.setPrice(new BigDecimal(1.99));
    dto.setProductId(1L);
    dto.setRemainingStock(1);
    dto.setStoreId(1L);
    // when
    Product entity = productMapper.productDtoToProduct(dto);
    // then
    assertNotNull(entity);
    assertEquals(entity.getCategory().getCatName(), dto.getCategoryName());
    assertEquals(entity.getDescription(), dto.getDescription());
    assertEquals(entity.getLimitations(), dto.getLimitations());
    assertEquals(entity.getName(), dto.getName());
    assertEquals(entity.getPrice(), dto.getPrice());
    assertEquals(entity.getProductId(), dto.getProductId());
    assertEquals(entity.getRemainingStock(), dto.getRemainingStock());
    assertEquals(entity.getRetailStore().getStoreId(), dto.getStoreId());
    assertEquals(entity.getRetailStore().getStoreId(), dto.getStoreId());
  }

}

映射类

@Mapper(componentModel = "spring")
public interface ProductMapper {

  /**
   * Map product entity instance to product Dto instance.
   *
   * @param product entity product
   * @return dto product
   */
  @Mappings({ @Mapping(source = "category.catName", target = "categoryName"),
      @Mapping(source = "retailStore.storeId", target = "storeId") })
  ProductDto productToProductDto(Product product);

  /**
   * Map product Dto instance to product entity instance.
   *
   * @param productDto dto product
   * @return entity product
   */
  @Mappings({ @Mapping(source = "categoryName", target = "category.catName"),
      @Mapping(source = "storeId", target = "retailStore.storeId") })
  Product productDtoToProduct(ProductDto productDto);

  /**
   * Update product with the latest values from a product DTO.
   *
   * @param productDto dto product
   * @param product    entity product
   */
  @Mappings({ @Mapping(source = "categoryName", target = "category.catName"),
      @Mapping(source = "storeId", target = "retailStore.storeId") })
  void updateModel(ProductDto productDto, @MappingTarget Product product);

  // aggregated root

  /**
   * Map list of product entities to list of product DTOs.
   *
   * @param products List of product entities
   * @return list of product dto`s
   */
  @Mappings({ @Mapping(source = "category.catName", target = "categoryName"),
      @Mapping(source = "retailStore.storeId", target = "storeId") })
  List<ProductDto> toProductDtos(List<Product> products);

}

产品dto

@Data
public class ProductDto {
  private Long productId;
  private String name;
  private String categoryName;
  private Long storeId;
  private BigDecimal price;
  private byte[] picture;
  private String description;
  private String limitations;
  private Integer remainingStock;
}

产品实体

@Data
@Entity
public class Product {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "product_id")
  private Long productId;

  // defines foreign key column category_id and indicates the owner of the
  // ManyToOne relationship
  @ManyToOne
  @JoinColumn(name = "category_id")
  private Category category;

  @Lob
  @Basic
  private byte[] picture;

  private String name;

  private BigDecimal price;

  // defines foreign key column store_id and indicates the owner of the ManyToOne
  // relationship
  @JsonBackReference(value = "product-store")
  @ManyToOne
  @JoinColumn(name = "store_id")
  private RetailStore retailStore;

  private String description;

  private String limitations;

  @Column(name = "remaining_stock")
  private Integer remainingStock;

  /**
   * Constructor.
   */
  protected Product() {
  }

  /**
   * Constructor.
   *
   * @param category    category of the product
   * @param name        name of the product
   * @param price       price of the product
   * @param retailStore retail store selling this product
   */
  public Product(Category category, String name, BigDecimal price, RetailStore retailStore) {
    super();
    this.category = category;
    this.name = name;
    this.price = price;
    this.retailStore = retailStore;
  }

  /**
   * Converting bigDecimal scale (number of digits to the right of the decimal
   * point) of price to 2.
   */
  @PrePersist
  @PreUpdate
  public void pricePrecisionConvertion() {
    this.price.setScale(2, RoundingMode.HALF_UP);
  }

共有1个答案

苏昂雄
2023-03-14

@SpringBootTest(classes={ProductMapperImpl.Class})<-可以删除此内容吗

 @Autowired
      private ProductMapperImpl productMapperImpl ;  *<- add this*
 类似资料:
  • 我正在使用MapStruct,mapstruct-jdk8版本1.1.0.final并定义我通过spring注入的抽象类。 我正在研究如何能够通过Junit测试来测试它们?我有一个基本的主映射器,它将使用2个子映射器 我尝试了几种方法,但无法正确实例化映射器来测试它。 java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到Co

  • 怎么做?没有找到可以基于类型动态映射的示例。我发现这种方法在、Google中都非常方便。感谢你的帮助!

  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 我正在使用Spring,并且在我的项目中从mapstruct库开始,所以我有了一个想法,为@mapper(componentModel=“Spring”)创建原型注释,比如@springmapper。但它不会生成任何映射器。 是不可能还是我做错了什么?

  • Hi这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:

  • 假设我需要将两个对象映射成一个或一个对象映射成一个(重载)。我可以通过以下映射来实现: 是否有一种方法可以更改第二个映射器“先做第一个映射器”,然后应用的附加映射?