当前位置: 首页 > 知识库问答 >
问题:

Spring Boot单元测试时删除@Component

万承志
2023-03-14

请容忍我,因为这是我第一次使用Spring靴,所以这只是我认为正在发生的事情。。。

我有两个方法,都是用Scheduled注释的。它们工作得很好,我已经配置并注入了所有依赖项。这些依赖关系非常重,依赖于internet连接等。我将它们注释为懒惰,因此它们只是在最后一刻才实例化。

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

当我在我们的CI服务器上运行我的单元测试时,它们会失败,因为服务器不与数据库认证(也不应该认证)。

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

如何防止在测试运行时创建特定组件?

计划工作类别:

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

顾嘉德
2023-03-14

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

@MockBean
public Database d;
温举
2023-03-14

我知道你说过:

显然,我不想在这些测试中为完全无关的类创建mock。

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

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

    @Test
    public void yourTest(){
        ...
    }
}

类似的问题/答案:在每个spring boot@测试中重写单个@配置类

 类似资料:
  • 需要对项目的控制器部分进行单元测试,但却得到了错误。我相信ModelAndVIew部分导致了这个问题,尽管我曾经嘲弄过它并返回ModelAndVIew,因为它是方法的返回类型。然而,它并不起作用。pom.xml没有任何问题,因此没有添加它。ProjectController: java.lang.IllegalStateException:找不到@SpringBootConfiguration,您

  • 我有一个在命令行上运行的springboot 2应用程序。命令行参数之一是命名中带有batchNo的fileName。我正在使用命令行参数中的fileName设置我application.properties的fileName值。示例 在我的应用程序配置文件中,我像这样从applications.properties文件中读取文件名。 我的目标是能够为每个单独的测试动态设置这个文件名。 示例 如何

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit

  • 我要从Thorntail搬到Quarkus。在我的测试中,我曾创建一个@deployment方法,在该方法中,我只放置测试所需的内容。特别是,我没有把一个类放在@Startup注释中(因为我不想测试它…)。当我移动到QUARKUS时,我抑制了de@deployment静态方法,然后当我启动测试时@Startup是。。。一开始,发生了很多不好的事情,阻止我测试我想要测试的东西(好吧,它崩溃了,因为它

  • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?

  • 问题内容: 我编写了一个测试UsersController的单元测试。UsersControllerTest.findUser工作正常,但不能正常运行UsersControllerTest.insertGetModifyDelete。 在测试日志中,我可以看到POST请求与UsersController的任何方法都不匹配,但是我不明白为什么。您能帮我这个吗? 这是我其余的Java类: 我有2种方法