在我的多模块项目中,我将集成测试作为单独的模块进行。该测试已将应用程序jar添加为依赖项。是否可以从集成测试中覆盖应用程序Bean定义?
在应用程序中,我具有以下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 {
}
最后在我的MailTestConfiguration中,我定义了另一个JavaMailSender
@Primary
@Bean
@Profile(TestProfiles.MAIL_GREEN_SMTP)
public JavaMailSender javaMailService() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("localhost");
javaMailSender.setPort(3025);
return javaMailSender;
}
当我从应用程序本身运行测试时,它正在工作。当我从另一个模块运行测试时,不会覆盖Bean。
我知道在应用程序内部定义的AppConfiguration类无法对集成测试配置类进行组件扫描,因此我还加载了AppTestConfiguration。
@Configuration
@ComponentScan(basePackages = {"..."})
public class AppTestConfiguration extends AppConfiguration {
}
如何使其工作?
答案 0 :(得分:1)
您应该检查两件事:
答案 1 :(得分:0)
确定我搞砸了个人资料。在我的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