Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapStruct Junit-使用CDI注入内部映射器_Java_Mapstruct - Fatal编程技术网

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设置内部映射器