在spring boot auto配置项目中,有两个emailSender子类:MockEmailSender和TextEmailSender。在自动配置中,只应创建一个mailSender:
@Bean
@ConditionalOnMissingBean(MailSender.class)
@ConditionalOnProperty(name="spring.mail.host", havingValue="foo", matchIfMissing=true)
public MailSender mockMailSender() {
log.info("Configuring MockMailSender");
return new MockMailSender();
}
@Bean
@ConditionalOnMissingBean(MailSender.class)
@ConditionalOnProperty("spring.mail.host")
public MailSender smtpMailSender(JavaMailSender javaMailSender) {
log.info("Configuring SmtpMailSender");
return new SmtpMailSender(javaMailSender);
}
以下是我的单元测试代码:
@SpringBootApplication
public class LemonTest implements ApplicationContextAware{
private ApplicationContext context;
public static void main(String[] args){
SpringApplication.run(LemonTest.class, args);
System.out.println("haha");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class InitTest {
@Autowired
private MailSender mailSender;
@Test
public void test(){
assertNotNull(mailSender);
}
}
属性是
spring.mail.host=foo
spring.mail.port=587
spring.mail.username=alert1
spring.mail.password=123456
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
根据我的自动配置,只应初始化MockEmailSender, 但是两个emailSender bean都已创建,因此在运行单元测试时会抛出多个bean错误。我猜我的配置设置没有被测试加载。
那么如何在测试中包含自动配置?什么是测试自动配置的最佳实践?
答案 0 :(得分:1)
我终于解决了。只需将@Import(LemonAutoConfiguration.class)
添加到应用程序中即可。
@SpringBootApplication
@Import(LemonAutoConfiguration.class)
public class LemonTest implements ApplicationContextAware{
private ApplicationContext context;
public static void main(String[] args){
SpringApplication.run(LemonTest.class, args);
System.out.println("haha");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
}
答案 1 :(得分:0)
我总是使用单独的"配置文件"创建多个测试。控制加载/设置的内容,在测试中设置活动的配置文件。
@ActiveProfiles({ "test", "multipleemail" })
然后,您的测试将确保预期的结果(上下文中的多个电子邮件提供商等)。 如果需要单独的属性,可以导入属性。我在src / test中专门为我的单元测试存储了一个。
@PropertySource({ "classpath:sparky.properties" })