Как написать тест Junit для mapstruct абстрактного картографа, введенного через пружину

Я использую MapStruct, mapstruct-JDK8 версии 1.1.0.Финал и определение абстрактного класса, который я введу через пружину.

Я смотрю, как можно проверить их с помощью теста Junit ? У меня есть основной картограф, который будет использовать 2 sub mappers

@Mapper(componentModel = "spring", uses = {SubMapper1.class, SubMapper2.class})
public abstract class MainMapper {

  @Mapping(target = "field1", qualifiedByName = {"MyMapper2Name", "toEntity"})
  public abstract MyEntity toEntity(MyDto pDto);

  public MyDto fromEntity(MyEntity pEntity) {
     // Specific code, hence why I use Abstract class instead of interface. 
  }
}

Я пробовал несколько вещей, но не могу заставить mapper быть правильно создан, чтобы проверить его.

@RunWith(SpringRunner.class)
public class MainMapperTest {

    private MainMapper service = Mappers.getMapper(MainMapper.class);

    @Test
    public void testToEntity() throws Exception {
.....

java.ленг.К RuntimeException: Java для.ленг.ClassNotFoundException: не удается найти реализацию для com.картографы.MainMapper

Я также пробовал через @InjectMock, но не кости.

невозможно создать экземпляр поля @InjectMocks с именем "service". Вы не предоставил экземпляр в объявлении поля, поэтому я попытался построить пример. Однако я потерпел неудачу, потому что: тип ' MainMapper абстрактный класс.

и через Spring @Autowired

вызвана: орг.springframework.зернышки.фабрика.NoSuchBeanDefinitionException: Нет квалификационный Боб типа com.картографы.MainMapper' в наличии: ожидается по крайней мере 1 драже, которое квалифицируется как autowire кандидатом. Зависимость комментарии: {@org.springframework.зернышки.фабрика.аннотация.Autowired (required=true)}

Я предполагаю, что это может быть связано с обработчиком аннотаций, и mapper не генерируется при запуске теста. Я нашел этот класс как пример.

однако класс AnnotationProcessorTestRunner, похоже, не доступен до 1.2, который еще не имеет окончательного выпуска.

поэтому мой вопрос в том, как написать тесты Junit, чтобы проверить мой mapstruct абстрактный класс mapper, который я использую через Spring injection в моем коде.

2 ответов


у вас есть несколько проблем:

  1. вы должны использовать Mappers#getMapper(Class) только со значением по умолчанию componentModel, в противном случае сопоставитель не будет создан правильно. Если вы получаете RuntimeException есть это означает, что класс реализации не было создано. Убедитесь, что у вас есть правильная настройка
  2. вам нужно протестировать против реализации MainMapperImpl а не против абстрактного класса.
  3. если вы хотите испытать с фасолью весны после этого, то вам нужно используйте правильный ComponentScan и убедитесь, что реализация и используемые картографы могут быть автоматически подключены.

класс, который вы связали, является неправильным тестовым классом и не связан с вашим тестовым случаем. Взгляните на этой интеграционный тестовый случай для весенней интеграции.

на AnnotationProcessorTestRunner является частью наших тестов и используется для тестирования процессора аннотаций и существует с самого начала. Это не является частью релизов.


в ответ на комментарий @Richard Lewan вот как я объявил свой тестовый класс для абстрактного класса ConfigurationMapper, используя 2 subMappers

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ConfigurationMapperImpl.class, SubMapper1Impl.class, SubMapper2Impl.class})
public class ConfigurationMapperTest {

вы используете impl, сгенерированный в SpringBootTest аннотация А затем введите класс, который вы хотите проверить

@Autowired
private ConfigurationMapper configurationMapper;

Дайте мне знать, если вам нужна дополнительная информация, но оттуда это просто. Я не издевался над субмаппером, так как для меня было лучше проверить весь процесс отображения сразу.