基本上,我只是想测试我的映射器,它应该是由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);
}
@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这似乎适用于添加额外的方法,但不适用于在现有方法上添加新的注释。假设我们有以下课程:
假设我需要将两个对象映射成一个或一个对象映射成一个(重载)。我可以通过以下映射来实现: 是否有一种方法可以更改第二个映射器“先做第一个映射器”,然后应用的附加映射?