请耐心等待,因为这是我第一次使用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.
}
}
答案 0 :(得分:4)
我知道你说过:
我显然不想在这些测试中为完全不相关的类创建模拟。
但是,您知道,您可以轻松地覆盖此测试的不需要的组件:
@RunWith(...)
@Context...
public class YourTest {
public static class TestConfiguration {
@Bean
@Primary
public Database unwantedComponent(){
return Mockito.mock(Database.class);
}
}
@Test
public void yourTest(){
...
}
}
类似的问题/答案:Override a single @Configuration class on every spring boot @Test
答案 1 :(得分:0)
Just add the following to your test class:
@MockBean
public Database d;