Spring Boot中的溢出单元测试和集成测试

时间:2019-08-23 15:26:35

标签: java spring-boot tdd liquibase

需要总体思路

在弹簧靴中可以进行良好的单元测试的条件是什么?

讨论领域

  • 我们应该使用@Autowired来调用单元测试中的另一个类吗?还是,所有内容都应使用Mock。
  • @Mock@MockBean
  • 如果我们在单元测试类中同时使用@Mock@Autowired,那么它是否仍然有资格成为单元测试或成为集成测试。

注意:注意@RunWith进行集成并删除集成。我的问题重点在于在Spring Boot应用程序中编写良好的单元测试。 谢谢

2 个答案:

答案 0 :(得分:0)

在单元测试时,通常使用@Mock作为依赖项是一个好习惯。您不一定需要加载spring上下文来运行单元案例。使用Mocks时,可以独立于spring上下文运行测试。单元测试中的@Autowired稍微有点像应用程序集成测试,在其中加载spring上下文,至少是其中的一部分用于测试。

答案 1 :(得分:0)

考虑像这样的方法PerformPayment(double amount, PaymentService service);

单元测试将是您为service参数创建模拟的测试。

集成测试将是you use an actual external service所在的测试,以便您测试该服务是否正确响应了您的输入数据。

如果我进一步介绍细节

Unit tests是用于测试所测试的代码在实际类中的测试。 Other dependencies of this class are mocked or ignored, because the focus is to test the code inside the class.

Integration tests是涉及目标应用程序的磁盘访问,应用程序服务和/或框架的测试。 The integration tests run isolated from another external service.

我将举一个例子。您有一个Spring应用程序,并且进行了很多单元测试,以确保业务逻辑正常运行。完善。但是您必须保证进行哪种测试:

您的应用程序服务可以启动

您的数据库实体已正确映射

所有必要的注释都按预期工作

您的过滤器运行正常

您的API正在接受某种数据

您的主要功能确实可以在基本情况下正常工作

您的数据库查询正在按预期运行

等等...

这不能用单元测试来完成,但是作为开发人员,您需要确保所有功能也能正常工作。这是集成测试的目标。

理想的方案是集成测试独立于应用程序在生产环境中使用的另一个外部系统运行。您可以使用Wiremock for Rest调用,H2之类的内存数据库,从某些调用外部系统的特定类中模拟bean等来实现此目的。

出于好奇,Maven有一个用于集成测试的特定插件:maven故障安全插件,该插件执行名称以IT结尾的测试类。例如:UserIT.java。

阅读更多关于大师的信息 https://martinfowler.com/bliki/IntegrationTest.html