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

在单片SpringBoot应用程序中创建集成测试

冀景明
2023-03-14

我被要求在一个非常大的SpringBoot项目中为一个服务创建一个集成测试,该项目产生了几十个已实现的服务。当应用程序执行时,所有这些服务都被部署了——我希望避免部署与我正在为其创建测试的服务无关的所有服务。不幸的是,我(还)没有像我希望的那样有很多Spring启动测试的经验,因此我想知道解决这个问题的最佳方法是什么。

我曾考虑在测试类中使用@MockBean注释对所有不相关的服务进行注释,并使用@Autowire对所有相关服务进行注释,但我不确定这是否正确。谁能给我指出正确的方向吗?

非常感谢。

共有3个答案

严升
2023-03-14

我有一个类似的问题,就是希望能够在Springboot中隔离特定组件(或服务)的集成测试;我的限制是我必须使用JUnit5和Mockito。

我从Baeldung找到了这两篇文章,它们通常只给出特定场景的具体答案,而不是一般的解决方案:https://www.baeldung.com/injecting-mocks-in-spring https://www.baeldung.com/junit-5-runwith

长话短说,我找到了如下解决方案:

您可以模拟bean,也可以实例化没有依赖项的bean(也就是说叶子bean)

最后,在您的集成测试中,您可以使用以下方法模拟您模拟的bean的方法调用when(cut.getInitRequestRepo().initRequest(ArgumentMatchers.any(InParamInitRequest.class)))。然后返回(outParamInitRequest)

我使用的POM依赖项:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
            <scope>test</scope>
        </dependency>
 <!-- Testing with Mocks -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>3.11.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>3.11.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.7.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.10.0</version>
            <scope>test</scope>
        </dependency>

欧阳晗日
2023-03-14

如果必须创建spring集成测试,则必须:-通过在测试类上使用注释调用spring上下文-例如:@RunWith(SpringJUnit4ClassRunner.class)-在您不打算测试的服务上使用@MockBean或@SpyBean注释,但它们是测试方法/类的一部分-在您打算测试的类上使用@Autowired注释。要验证结果,可以使用Junit4或Junit5断言;要验证行为,可以使用Mockito

柴高岑
2023-03-14

答案在很大程度上取决于集成测试的范围。我将尝试介绍两种主要的方法,你可以在谷歌上搜索更多的例子和细节。Spring Boot测试文档也是您的朋友。

SpringBoot提供了称为切片的测试实用程序。例如,有一个用于测试控制器的切片-@WebMvcTest-此测试将加载从HTTP和指定控制器调用应用程序的所有配置(@WebMvcTest(YourController.class))。之后,您需要决定如何处理该控制器的依赖项。

你可以:

  • @MockBean模拟它们
  • 使用@Import(然后您必须再次处理新导入的依赖项的依赖项)提供真正的实现(或附加配置)
  • 加载Spring Boot自动配置的附加部分。这可以使用@autoconfiguremething注释来完成。-所有切片基本上都是自动配置注释的组合,您可以自由地将它们添加到测试中。例如,查看DataJpaTest上的注释,了解如何添加功能来使用测试数据库设置Spring Boot数据JPA

每个测试最多可以有一个切片,但您可以导入任意数量的附加服务、配置、模拟、自动配置等。关键是-您可以选择为测试配置的内容;具有新依赖项的新的不相关服务不应破坏现有测试。

春靴测试

另一种方法是@springbootest注释-这是相反的方向-默认情况下,它加载所有内容,您可以使用@MockBean@EnableAutoConfiguration(exclude=SomeClass)等工具排除不需要的内容。

添加新服务时,当然有破坏现有测试的危险。-这不应该经常发生,因为一切都是自动配置的,但这仍然是一种可能性,尤其是在配置更多的monolith中。

 类似资料:
  • 问题内容: 我被要求为一个很大的SpringBoot项目中的服务创建一个集成测试,该项目会产生许多已实现的服务。执行该应用程序时,将部署所有这些服务- 我想避免部署与我正在为其创建测试的服务无关的所有服务。不幸的是,我对弹簧启动测试的经验还不如我所希望的那么多,因此我想知道解决这个问题的最佳方法是什么。 我当时正在考虑使用注解对所有不相关的服务进行注释,并在测试类中对所有相关的服务进行注释,但是我

  • 我想用liquibase变更集进行模拟数据的集成测试,如何使其不影响真实数据库?我从这里找到了部分想法,但我使用的是springboot,我希望有更简单的解决方案。

  • 我对springfox和Swagger2都是新手。我一直在尝试将SpringFox/Swagger2与我的spring boot微服务集成以生成API文档。 我遵循了“http://springfox.github.io/springfox/docs/snapshot/”站点中给出的步骤。但是我没有成功的带来api文档页面。 每当我试图点击URL“http://localhost:8081/swa

  • 我希望文档的显示方式类似于它在特定于应用程序的上下文路径下的文档中提到的方式。你能告诉我我错过了什么吗?

  • 在我的springboot应用程序中,我使用以下类执行集成测试 下面是在我的测试配置类中定义的bean 不过,只创建生产bean而不创建主bean。

  • 我想为类“ImageController”创建单元测试。由于映像必须由创建的用户拥有,所以我希望在执行单元测试之前创建一个用户(使用@before)。如何创建此用户?在测试UserController本身时,我做了如下操作: