MapStruct Junit - введение внутреннего картографа с помощью CDI - PullRequest
0 голосов
/ 04 декабря 2018

В настоящее время Mapper содержит внутренние Mappers (иногда они сами содержат другие внутренние Mappers).

Они определены следующим образом:

@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 mapper использует @Inject B, во время моих тестов JUnit отображение bean-компонента CDI отключено (нет arquillian).Как я мог издеваться, вводить или создавать экземпляр 2-го картографа, чтобы пройти тест?

Я посмотрел другие ответы, но они касаются только Spring.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Без создания контекста 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.

0 голосов
/ 05 декабря 2018

Я бы посоветовал не делать макет Mapper и не настраивать тест с CDI, который действительно может правильно создать все Mappers (не имея опыта работы с CDI, чтобы предложить решение).

Сказав, что вы можете использовать Mapper#injectionStrategy из 1.3.Вы можете использовать инжектор конструктора и вставлять в него свои макеты.

...