有人要求我在一个很大的SpringBoot项目中为一项服务创建集成测试,该项目会产生数十种已实现的服务。执行该应用程序时,将部署所有这些服务-我想避免部署与我要为其创建测试的服务无关的所有服务。不幸的是,我(至今)在弹簧启动测试方面的经验还不如我希望的那么多,因此我想知道解决这个问题的最佳方法是什么。
我当时正在考虑在测试类中使用@MockBean
注释对所有不相关的服务进行注释,并使用@Autowire
注释所有相关的服务,但是我不确定这是否是正确的方法。谁能指出我正确的方向?
谢谢。
答案 0 :(得分:2)
答案很大程度上取决于集成测试的范围。我将尝试介绍两种主要方法,您可以通过google等待更多示例和详细信息。 Spring Boot testing documentation也是您的朋友。
切片
Spring Boot提供了名为slices的测试实用程序。例如,有一个切片用于测试您的控制器-@WebMvcTest
-此测试将加载用于从HTTP和您指定的控制器(@WebMvcTest(YourController.class)
)调用应用程序的所有配置。之后,您需要决定如何处理该控制器的依赖项。
您可以:
@MockBean
模拟他们。@Import
提供真实的实现(或其他配置)(然后您必须再次处理新导入的依赖项的依赖项)。@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