Java MapStruct Junit-使用CDI注入内部映射器
当前有包含内部映射器的映射器(有时,映射器本身包含其他内部映射器) 它们的定义如下:Java MapStruct Junit-使用CDI注入内部映射器,java,mapstruct,Java,Mapstruct,当前有包含内部映射器的映射器(有时,映射器本身包含其他内部映射器) 它们的定义如下: @Mapper(componentModel = "cdi", uses = B.class) public interface A { ADto toDto(AEntity entity); } @Mapper(componentModel = "cdi") public interface B { BDto toDto(BEntity entity); } 当应用程序运行时,我可以简单地
@Mapper(componentModel = "cdi", uses = B.class)
public interface A {
ADto toDto(AEntity entity);
}
@Mapper(componentModel = "cdi")
public interface B {
BDto toDto(BEntity entity);
}
当应用程序运行时,我可以简单地插入主映射器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在映射过程中没有实例化。由于生成的映射器类使用@injectb,因此在我的JUnit测试期间,CDIBean映射是关闭的(没有arquillian)。如何模拟、注入或实例化第二个映射器以使测试通过
我看过其他答案,但它们只涉及Spring。我建议不要模拟Mapper并使用CDI设置一个测试,该测试实际上可以正确地创建所有Mapper(没有CDI经验来建议解决方案)
您可以使用1.3中的
Mapper#injectionStrategy
。您可以使用构造函数注入并在其中注入mock。无需创建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...
}
这将在A使用B时为A设置内部映射器