Spring Boot 在单元测试时删除@Component

Jos*_*osh 3 java spring unit-testing

请耐心等待,因为这是我第一次使用 Spring Boot,所以这只是我认为正在发生的事情......

我有几个用@Scheduled. 它们工作得很好,我已经配置并注入了所有依赖项。这些依赖项非常重要,依赖于互联网连接等。我将它们注释为@Lazy,因此它们仅在最后一分钟被实例化。

但是,需要标记包含计划方法的类,@Component这意味着它们是在启动时创建的。这引发了一个连锁反应,它创建了我的所有依赖项,无论我是否真的需要它们来进行我当前正在运行的测试。

当我在我们的 CI 服务器上运行我的单元测试时,它们失败了,因为服务器没有使用数据库进行身份验证(也不应该)。

测试这些@Scheduled作业的测试注入了自己的模拟,因此它们工作正常。但是,由于仍然创建类,因此完全不相关的测试会导致问题。我显然不想在这些测试中为完全不相关的类创建模拟。

如何防止@Component在测试运行时创建某些 a ?

预定作业类:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

配置类:

package example

@Configuration
public class ApplicationConfig {

    @Bean
    @Lazy
    public Database database() {
        return ...;// Some heavy operation I don't want to do while testing.
    }
Run Code Online (Sandbox Code Playgroud)

}

ale*_*xbt 5

我知道你说:

我显然不想在这些测试中为完全不相关的类创建模拟。

尽管如此,正如您所知,您可以轻松覆盖仅用于此测试的不需要的组件:

@RunWith(...)
@Context...
public class YourTest {
    public static class TestConfiguration {
        @Bean
        @Primary
        public Database unwantedComponent(){
            return Mockito.mock(Database.class);
        }
    }

    @Test
    public void yourTest(){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

类似的问题/答案:在每个 Spring Boot @Test 上覆盖单个 @Configuration 类