Как получить контекст spring из модуля maven

#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.