【发布时间】:2017-01-17 19:53:00
【问题描述】:
请耐心等待,因为这是我第一次使用 Spring Boot,所以这只是我认为正在发生的事情......
我有几个用@Scheduled 注释的方法。它们工作得很好,我已经配置并注入了所有依赖项。这些依赖关系很重,依赖于互联网连接等。我将它们注释为@Lazy,所以它们只在最后一分钟被实例化。
但是,包含预定方法的类需要用@Component 标记,这意味着它们是在启动时创建的。这引发了连锁反应,无论我当前运行的测试是否真的需要它们,都会产生我所有的依赖关系。
当我在 CI 服务器上运行单元测试时,它们会失败,因为服务器没有通过数据库进行身份验证(也不应该)。
测试这些@Scheduled 作业的测试注入了它们自己的模拟,因此它们工作正常。但是,由于仍在创建类,因此完全不相关的测试会导致问题。我显然不想在这些测试中为完全不相关的类创建模拟。
如何防止在测试运行时创建某个 @Component?
预定作业类:
package example.scheduledtasks;
@Component
public class ScheduledJob {
private Database database;
@Autowired
public AccountsImporter(Database database) {
this.database = database;
}
@Scheduled(cron="0 0 04 * * *")
public void run() {
// Do something with the database
}
}
配置类:
package example
@Configuration
public class ApplicationConfig {
@Bean
@Lazy
public Database database() {
return ...;// Some heavy operation I don't want to do while testing.
}
}
【问题讨论】:
-
也许this answer 可能会有所帮助。
-
感谢@Jaims,我已经看到了条件注释,但无法弄清楚我的条件是什么。有什么想法吗?
-
一种常见的方法是使用不同的配置文件。您有一个带有
@Profile()注释的TestConfig类,它可以将您的数据库模拟为一个轻量级对象。然后在您的测试类中,您可以使用@ActiveProfiles()来选择您的测试配置。在生产中,您可以提供不同的配置文件。
标签: java spring unit-testing