Бин весеннего переопределения другого модуля
В моем многомодульном проекте у меня есть интеграционные тесты как отдельный модуль. В этих тестах 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 ответа
Две вещи, которые вы должны проверить:
- Правильный ли профиль Spring включен при запуске тестов из другого модуля?
- Находится ли данная конфигурация в пути сканирования при запуске тестов из другого модуля?
Конечно, я перепутал с профилями. В моем 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