#java #spring #spring-boot #unit-testing #multi-module
#java #spring #spring-boot #модульное тестирование #многомодульный
Вопрос:
У меня возникла проблема при попытке выполнить тест в моем проекте spring-boot.
как вы можете видеть, мой проект разделен на модули maven. «alta-launcher» — это «основной» проект, получающий все остальные модули в качестве зависимостей. Проблема в том, что мои тесты в пользовательском модуле не получат контекст spring, поэтому мои поля «Autowired» будут равны нулю во время выполнения.
Есть идеи, как настроить этот проект, чтобы иметь возможность выполнять тесты в каждом модуле?
Редактировать :
@SpringBootTest(classes = CoreApplication.class)
class UserQueryTransformerImplTest {
@Autowired
private UserQueryTransformer userQueryTransformer;
@Test
void toDTO() {
UserEntity userEntity = new UserEntity();
userEntity.setLogin("everest");
userEntity.setFirstName("Everest");
userEntity.setLastName("Mountain");
UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);
assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
}
Аннотация @SpringBootTest с классами атрибутов непригодна для использования, потому что у меня нет доступа к модулю запуска из пользовательского модуля. А без атрибута (просто @SprinBootTest) — это когда я получаю поле autowire null, что имеет смысл, потому что у меня нет контекста.
Комментарии:
1. Просмотрите документы: spring.io/guides/gs/multi-module . Он охватывает почти все, что вам может понадобиться!
2. Спасибо за ваш ответ, но я уже несколько раз просматривал этот документ, и в моем случае это не помогает… Мой проект разделен на модули, которые являются моими доменами, модуль запуска получает другие модули в качестве зависимости, поэтому у меня нет контекста из этих модулей: (
3. Ваше автоматически подключенное поле не может быть
null
. Вместо этого ваше приложение или тест будут взорваны сUnsatisfiedDependencyException
. Итак, если это такnull
, вы делаете что-то неправильно (не используете Spring для запуска своего теста, самостоятельно создаете экземпляры и т.д.). Однако, поскольку вы опубликовали только изображение структуры вашего проекта и не добавили свой фактический тест, это невозможно определить.4. Я отредактировал свой пост, чтобы у вас было больше информации. Надеюсь, это поможет
5. Вы не можете включить Spring Boot jar в качестве зависимости в другой проект. Файл Spring BOot fat jar имеет другую структуру (из-за индивидуальной загрузки классов), и поэтому классы недоступны. Если вы действительно этого хотите, вам придется доставить 2 артефакта: 1 fatjar и не-fatjar (обычный jar), содержащий классы.
Ответ №1:
Я смог устранить проблему, используя аннотацию ContextConfiguration. (ExtendWith предназначен для части junit5)
@ContextConfiguration(classes = ConfigurationTest.class)
@ExtendWith(SpringExtension.class)
class UserQueryTransformerImplTest {
@Autowired
private UserQueryTransformer userQueryTransformer;
@Test
void toDTO() {
UserEntity userEntity = new UserEntity();
userEntity.setLogin("everest");
userEntity.setFirstName("Everest");
userEntity.setLastName("Mountain");
UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);
assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
}
и вот мой configurationTest.java
@TestConfiguration
public class ConfigurationTest {
@Bean
UserQueryTransformer createUserQueryTransformer() {
return new UserQueryTransformerImpl();
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
UserQueryDTO createUserQueryDTO() {
return new UserQueryDTO();
}
Ответ №2:
Вы можете воссоздать свой пользовательский контекст в тестах, попробуйте что-то вроде этого:
@ContextConfiguration
@RunWith(SpringRunner.class)
class UserQueryTransformerImplTest {
@TestConfiguration
static class Config {
@Bean
public UserQueryTransformer uqt() {
return new UserQueryTransformer();
}
}
@Autowired
private UserQueryTransformer userQueryTransformer;
@Test
void toDTO() {
UserEntity userEntity = new UserEntity();
userEntity.setLogin("everest");
userEntity.setFirstName("Everest");
userEntity.setLastName("Mountain");
UserQueryDTO userQueryDTO = userQueryTransformer.toDTO(userEntity);
assertEquals(userEntity.getLogin(), userQueryDTO.getLogin());
assertEquals(userEntity.getFirstName(), userQueryDTO.getFirstName());
assertEquals(userEntity.getLastName(), userQueryDTO.getLastName());
}
Комментарии:
1. Спасибо за ответ, но он все еще не работает, я попробовал вложенный класс и импорт. С вложенным классом мой автозапуск по-прежнему равен нулю. При импорте я получаю исключение IllegalStateException: не удается найти конфигурацию SpringBootConfiguration …
2. На самом деле это больше похоже на то, что когда я использую SpringBootTest, я получаю исключение IllegalStateException, и если я его не использую, значение autowired равно null. Похоже, что это действительно не заботится о тестовой конфигурации (вложенной или импортируемой)
3. Привет, попробуйте добавить аннотацию @ContextConfiguration.