为什么Spring Boot中有不同类型的集成测试

为什么Spring Boot中有不同类型的集成测试,spring,testing,spring-boot,resttemplate,spring-test,Spring,Testing,Spring Boot,Resttemplate,Spring Test,有人知道为什么Spring引导指南包含两种不同类型的集成测试吗?() 一个使用TestRestTemplate,一个使用MockMvc依赖项?在每个测试类型中,spring引导引导测试环境。那么这种分离的原因是什么呢?当您使用MockMvc时,您正在测试应用程序的一个实例,其中HTTP请求周期已被模拟。因此,这里的测试范围只是应用程序的MVC方面。我不认为这通常会被标记为“集成测试”,相反,它更接近于单元测试(尽管它的范围比单个类大得多) 当您使用testrestemplate时,您正在测试应用

有人知道为什么Spring引导指南包含两种不同类型的集成测试吗?()


一个使用TestRestTemplate,一个使用MockMvc依赖项?在每个测试类型中,spring引导引导测试环境。那么这种分离的原因是什么呢?

当您使用
MockMvc
时,您正在测试应用程序的一个实例,其中HTTP请求周期已被模拟。因此,这里的测试范围只是应用程序的MVC方面。我不认为这通常会被标记为“集成测试”,相反,它更接近于单元测试(尽管它的范围比单个类大得多)

当您使用
testrestemplate
时,您正在测试应用程序的真实实例,即,您正在“弹出”整个应用程序上下文,并将其作为外部参与者调用。这通常被称为“集成测试”,它可能是最接近您实际使用情况的测试

现在,由于通过
testrestemplate
调用的“完整堆栈”集成测试可以提供由
MockMVC
测试提供的覆盖范围的超集,您可能想知道为什么要使用
MockMVC
测试。如果是的话,那么我认为这是一个

  • 试验范围<代码>MockMVC测试用例通常比完全集成测试更快、更容易启动(因为它们使用的应用程序上下文更少)。此外,由于它们使用较少的应用程序上下文,您可能不必费劲地模仿真实应用程序上下文中在测试中表现不好的任何方面

  • 易用性
    MockMVC
    附带了用于断言HTTP状态、询问和断言JSON响应等的静态帮助程序。当然,YMMV,但对于许多人来说,这些帮助简化了开发,并有助于交付可读的测试用例

实际上,您可能希望结合使用这两种方法:

  • MockMVC
    测试整个控制器层的详细测试,包括所有映射、所有调用的快乐和悲伤路径以及HTTP状态码、内容体等的深层断言
  • testrestemplate
    测试从用户角度表达的主要流,例如
    保存一个新的Foo
    搜索所有Foo
    提交一个无效的Foo更新
    等,断言集中在用户看到/感兴趣的位上

感谢您的详细解释!我唯一不能确认的是MockMVC测试更快。(在我的机器上)所用的时间完全相同