【发布时间】:2021-11-19 09:27:00
【问题描述】:
我尝试了在 Stackoverflow 上找到的不同方法。这就是我知道如何将映射器与 MapStruct 一起使用的方式。 我有一个像这样的 Mapper 类:
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface DummyMapper {
DummyMapper INSTANCE = Mappers.getMapper(DummyMapper.class);
DummyResponseApi modelToApi(DummyResponse DummyResponseModel);
}
还有我的单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {DummyMapper.class})
class ServiceClassTest {
private DummyService service;
}
我要测试的服务方法:
public DummyModelApi getSomething() {
DummyModel mapMe = new DummyModel();
return DummyMapper.INSTANCE.modelToApi(mapMe);
}
在较旧的项目中,我以同样的方式这样做并且没有任何问题。现在我在 Spring Boot 2.5.6 和 MapStruct 1.5.0.Beta1 的新项目中使用它。
使用@SpringBootTest,据我所知,Spring实际上是在启动应用程序,应该创建Mapper类,所以我不明白,为什么Mapper总是为null?! 当我删除 @SpringBootTest 中的 DummyMapper.class 时,会出现“无法加载应用程序上下文”的错误。这向我表明,映射器已被识别。
我觉得奇怪的另一件事是,我必须在我的映射器中使用“unmappedTargetPolicy = ReportingPolicy.IGNORE”,否则我会收到错误消息“找不到未映射的属性”或其他东西,即使有明确的属性两个模型中的名称相同。这在旧项目中总是没有问题,不知道为什么 MapStruct 现在做奇怪的事情。
【问题讨论】:
-
你能粘贴错误吗?因为您实例化映射器的方式不应影响运行 SpringBootTest 或运行简单的单元测试,因为映射器在类加载时被实例化为单例。
-
@Sergio Lema:没有错误。当我在映射器应该返回映射对象的地方设置断点时,对象的所有属性都为空,我得到一个 NullPointerException 并且我的测试当然失败了。
-
您的意思是 DummyMapper.INSTANCE 为 null 还是传递给 modelToApi 的对象的字段为 null?粘贴你的 NullPointerException 堆栈跟踪,它会有很大帮助。
-
@Sergio Lema:DummyMapper.INSTANCE 不为空。映射方法返回的对象的字段为空。我想我已经先解决了这个问题,为什么错误消息“mapper\DummyMapper.java:40: error: Unmapped target property: "simpleText". DummyResponseApi modelToApi(DummyResponse dummyResponseModel);”当我运行任务组装时出现。我在映射器中删除了“unmappedTargetPolicy = ReportingPolicy.IGNORE”。简单映射1个同名属性应该没问题吧?
-
我添加了方法注释“@Mapping(target = "simpleText", source = "simpleText") DummyResponseApi modelToApi(DummyResponse dummyResponseModel);"我收到错误“源参数中不存在名为“simpleText”的属性。类型“DummyResponse”没有属性。@Mapping(target =“simpleText”,source =“simpleText”)”,但属性simpleText存在于DummyResponse ``` @Data @Accessors(chain = true) @AllArgsConstructor @NoArgsConstructor public class DummyResponse { private String simpleText; } ```
标签: java spring-boot unit-testing nullpointerexception mapstruct