在单元测试时,移除组件上的 Spring Boot

4dc9hkyq  于 2022-11-21  发布在  Spring
关注(0)|答案(3)|浏览(171)

请原谅我,因为这是我第一次使用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.
    }

}

xtfmy6hx

xtfmy6hx1#

我知道你说过:
我显然不想在这些测试中为完全不相关的类创建模拟。
不过,您可以轻松地覆盖不需要的组件,仅用于此测试:

@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

ev7lccsx

ev7lccsx2#

只需将以下内容添加到测试类中:

@MockBean
public Database d;
m2xkgtsf

m2xkgtsf3#

另一种选择:测试时使用内存中的数据库,如h2。

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

例如,请参阅https://www.baeldung.com/spring-boot-h2-database

相关问题