如何进行弹簧启动自动配置的单元测试

时间:2017-07-27 07:03:12

标签: spring unit-testing spring-boot

在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错误。我猜我的配置设置没有被测试加载。

那么如何在测试中包含自动配置?什么是测试自动配置的最佳实践?

2 个答案:

答案 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" })