在整体式SpringBoot应用程序中创建集成测试

时间:2020-02-12 16:23:12

标签: java spring-boot testing spring-boot-test

有人要求我在一个很大的SpringBoot项目中为一项服务创建集成测试,该项目会产生数十种已实现的服务。执行该应用程序时,将部署所有这些服务-我想避免部署与我要为其创建测试的服务无关的所有服务。不幸的是,我(至今)在弹簧启动测试方面的经验还不如我希望的那么多,因此我想知道解决这个问题的最佳方法是什么。

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

谢谢。

2 个答案:

答案 0 :(得分:2)

答案很大程度上取决于集成测试的范围。我将尝试介绍两种主要方法,您可以通过google等待更多示例和详细信息。 Spring Boot testing documentation也是您的朋友。

切片

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

您可以:

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

每个测试最多可以包含一个切片,但是您可以导入任意数量的其他服务,配置,模拟,自动配置等。具有新依赖性的新的不相关服务不应破坏现有测试。

SpringBootTest

另一种方法是@SpringBootTest注解-方向相反-默认情况下,它会加载所有内容,并且您可以使用@MockBean@EnableAutoConfiguration(exclude=SomeClass)等排除不需要的内容。< / p>

在添加新服务时,当然存在打破现有测试的危险。 -这应该不会经常发生,因为所有内容都是自动配置的,但是仍然有可能出现,尤其是在具有更多配置的整体中。

答案 1 :(得分:0)

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