Бин весеннего переопределения другого модуля

В моем многомодульном проекте у меня есть интеграционные тесты как отдельный модуль. В этих тестах jar приложения добавлен в качестве зависимости. Можно ли переопределить определение бина приложения из интеграционных тестов?

В приложении у меня есть следующий Bean (стандартная конфигурация отправителя java почты)

@Configuration
public class MailConfiguration {

   @Bean
   public JavaMailSender javaMailService() {
      JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
      //standard mail configuration using properties
   }
}

Теперь все мои интеграционные тесты расширяют BaseIntegrationTest, который загружает класс конфигурации теста

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { AppTestConfiguration.class, MailTestConfiguration.class})
public class BaseIntegrationTest {

}

И, наконец, в моей конфигурации MailTest я определяю другую JavaMailSender

@Primary
@Bean
@Profile(TestProfiles.MAIL_GREEN_SMTP)
public JavaMailSender javaMailService() {

    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setHost("localhost");
    javaMailSender.setPort(3025);

    return javaMailSender;
}

Это работает, когда я запускаю тесты из самого приложения. Когда я запускаю тесты из другого модуля, компонент не переопределяется.

Мне известно, что класс AppConfiguration, определенный внутри приложения, не может сканировать компоненты конфигурации классов тестирования интеграции, поэтому я также загружаю AppTestConfiguration.

@Configuration
@ComponentScan(basePackages = {"..."})
public class AppTestConfiguration extends AppConfiguration {

}

Как заставить это работать?

2 ответа

Решение

Две вещи, которые вы должны проверить:

  1. Правильный ли профиль Spring включен при запуске тестов из другого модуля?
  2. Находится ли данная конфигурация в пути сканирования при запуске тестов из другого модуля?

Конечно, я перепутал с профилями. В моем BaseIntegrationTest я определил активный профиль на основе конфигурации. Я также распечатал, какой профиль там разрешается (было напечатано правильное имя профиля)

    @BeforeClass public static void init () {System.setProperty (DEFAULT_PROFILES_PROPERTY_NAME, ProfileResolver.getActiveProfiles ()); }

После того, как вы убедили меня, что это должно работать, я перепроверил конфиг и обнаружил, что я также добавил spring.profiles.active в свойствах. После удаления этого конфига все работает как положено. Другой способ заключается в использовании AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME вместо AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME

Другие вопросы по тегам