单元测试

时间:2016-09-09 15:49:27

标签: java spring unit-testing

请耐心等待,因为这是我第一次使用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.
    }

}

2 个答案:

答案 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;