Как написать тест 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 ответов
у вас есть несколько проблем:
- вы должны использовать
Mappers#getMapper(Class)
только со значением по умолчаниюcomponentModel
, в противном случае сопоставитель не будет создан правильно. Если вы получаетеRuntimeException
есть это означает, что класс реализации не было создано. Убедитесь, что у вас есть правильная настройка - вам нужно протестировать против реализации
MainMapperImpl
а не против абстрактного класса. - если вы хотите испытать с фасолью весны после этого, то вам нужно используйте правильный
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;
Дайте мне знать, если вам нужна дополнительная информация, но оттуда это просто. Я не издевался над субмаппером, так как для меня было лучше проверить весь процесс отображения сразу.