【问题标题】:MapStruct Junit - Injecting Inner Mapper with CDIMapStruct Junit - 使用 CDI 注入内部映射器
【发布时间】:2019-05-05 23:18:22
【问题描述】:

目前有包含内部映射器的映射器(有时,它们本身包含其他内部映射器)。

它们的定义如下:

@Mapper(componentModel = "cdi", uses = B.class)
public interface A {
    ADto toDto(AEntity entity);
}

@Mapper(componentModel = "cdi")
public interface B {
    BDto toDto(BEntity entity);
}

当应用程序运行时,我可以简单地注入主 Mapper A 而不会出现任何问题,实体就会被转换。

但是,通过 JUnit,我似乎无法弄清楚如何实例化内部映射器。

public class InformationChassisMapperTest {
    @InjectMocks
    public A mapper = new AImpl();

    public AEntity;
    @Before
    public void init() {
       AEntity = new AEntity();
       // fill entity...
    }

    @Test
    public void test() {
       ADto = mapper.toDto(AEntity);
       // asserts...
    }
}

我得到一个 NPE,因为内部映射器 B 在映射期间没有实例化。由于生成的 A 映射器类使用 @Inject B,因此在我的 JUnit 测试期间,CDI bean 映射已关闭(没有 arquillian)。我如何模拟或注入或实例化第二个映射器以使我的测试通过?

我查看了其他答案,但它们仅涵盖 Spring。

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    在不创建 CDI 上下文的情况下,一种选择是使用 Mockito 定义内部类,例如:

    @Spy
    private B uses = Mappers.getMapper(B.class);
    
    @InjectMocks
    private A mapper = Mappers.getMapper(A.class);
    
    @Test
    public void test() {
       ADto = mapper.toDto(AEntity);
       // asserts...
    }
    

    这将在使用 B 时为 A 设置内部映射器。

    【讨论】:

      【解决方案2】:

      我建议不要模拟 Mapper 并使用 CDI 设置测试,该测试实际上可以正确创建所有 Mapper(没有使用 CDI 的经验来建议解决方案)。

      话虽如此,您可以使用 1.3 中的 Mapper#injectionStrategy。您可以使用构造函数注入并在其中注入您的模拟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-15
        • 1970-01-01
        • 2017-12-29
        • 2017-10-25
        • 2021-11-22
        • 2020-06-04
        • 1970-01-01
        • 2017-11-03
        相关资源
        最近更新 更多