【问题标题】:MapStruct Mapper always null in Unit testsMapStruct Mapper 在单元测试中始终为空
【发布时间】: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


【解决方案1】:

天哪,我找到了解决方案。现在我知道为什么我必须在我的映射器中添加“@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)”。

在这里找到解决方案:https://stackoverflow.com/a/69649688/8743351

Lombok 需要在 pom.xml/gradle.build 中的 mapstruct 之前。

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多