有人知道为什么Spring Boot指南包含两种不同类型的集成测试吗? (https://github.com/spring-guides/gs-spring-boot#add-unit-tests)
一种使用TestRestTemplate,另一种使用MockMvc依赖项?在每种测试类型中,Spring Boot都会引导测试环境。那么这种分离的原因是什么呢?
有人知道为什么Spring Boot指南包含两种不同类型的集成测试吗? (https://github.com/spring-guides/gs-spring-boot#add-unit-tests)
一种使用TestRestTemplate,另一种使用MockMvc依赖项?在每种测试类型中,Spring Boot都会引导测试环境。那么这种分离的原因是什么呢?
MockMvc
时,您正在测试一个已被模拟HTTP请求周期的应用程序实例。因此,在这里,测试范围仅限于应用程序的MVC方面。我认为这通常不会被标记为“集成测试”,而更接近于单元测试(尽管它的范围要大得多)。TestRestTemplate
时,您正在测试您的应用程序的一个真实实例,即您正在“启动”整个应用程序上下文并将其作为外部参与者调用。这通常称为“集成测试”,并且很可能是最接近实际使用的测试。TestRestTemplate
调用的“全堆栈”集成测试可以提供比MockMVC
测试提供的覆盖范围更大的超集,您可能想知道为什么还会费心进行MockMVC
测试。如果是这样,那么我认为这个问题是......
测试范围; MockMVC
测试用例通常比完整的集成测试快速且易于启动(因为它们使用较少的应用程序上下文)。此外,由于它们使用较少的应用程序上下文,您可能不必费力地模拟您的真实应用程序上下文中不适合测试的任何方面。
易用性; MockMVC
带有静态助手,可用于断言HTTP状态、查询和断言JSON响应等。当然,您的经验可能因人而异,但对于许多人来说,这些设施便利开发,并有助于提供可读性测试用例。
MockMVC
测试用于详细测试整个控制器层,包括所有映射、所有调用的happy和sad路径以及关于HTTP状态码、内容主体等的深度断言。TestRestTemplate
测试用于从用户的角度表达的主要流程,例如保存新Foo
,搜索所有Foos
,提交无效的Foo更新
等,其断言集中在您的用户看到/感兴趣的部分。