请原谅我,因为这是我第一次使用Sping Boot ,所以这只是我所认为的...
我有几个用@Scheduled
注解的方法。它们运行得很好,我已经配置和注入了所有的依赖项。这些依赖项相当重,依赖于互联网连接等。我把它们注解为@Lazy
,所以它们只是在最后一刻才被示例化。
然而,包含调度方法的类需要用@Component
标记,这意味着它们是在启动时创建的。这引发了一个连锁React,它创建了我所有的依赖项,无论我是否真的需要它们用于我当前正在运行的测试。
当我在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.
}
}
3条答案
按热度按时间xtfmy6hx1#
我知道你说过:
我显然不想在这些测试中为完全不相关的类创建模拟。
不过,您可以轻松地覆盖不需要的组件,仅用于此测试:
类似问题/答案:Override a single @Configuration class on every spring boot @Test
ev7lccsx2#
只需将以下内容添加到测试类中:
m2xkgtsf3#
另一种选择:测试时使用内存中的数据库,如h2。
例如,请参阅https://www.baeldung.com/spring-boot-h2-database。