【问题标题】:difference between @SpringBootTest(classes = SomeController.class) and @WebMvcTest(SomeController.class)@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 之间的区别
【发布时间】:2021-03-21 18:38:43
【问题描述】:
我知道使用@SpringbootTest 我在测试期间提高了整个弹簧上下文,或者在我使用@SpringBootTest(classes = SomeController.class) 的情况下我只提高了一个bean -> SomeController。如果这个控制器有一些依赖项,我需要模拟它们。使用注释@WebMvcTest(SoneController.class) 我将(根据我的知识)实现相同的目标。
问题是:在提供的示例中使用的这两个注释之间有什么区别吗?
【问题讨论】:
标签:
java
spring-boot
spring-mvc
mockito
【解决方案1】:
@SpringBootTest(classes = SomeController.class) 和 @WebMvcTest(SomeController.class) 之间有明显的区别。
-
@SpringBootTest(classes = SomeController.class) - 使用组件SomeController.class 启动服务器(例如Tomcat)+ spring 应用程序上下文。除了控制器之外,通常应该指定上下文配置以成功启动整个应用程序(例如:当您不指定classes时,它会回退到@SpringBootApplication)。
-
@WebMvcTest(SomeController.class) - 仅以SomeController.class 启动应用程序的Web 层。
有什么区别?
@SpringBootTest 测试通常是集成测试,您启动完整的 spring-boot 应用程序并针对该黑盒进行测试。您仍然可以通过在注释参数中提供配置、属性、Web 服务器类型等来调整应用程序启动。
但@WebMvcTest(SomeController.class) 通常是您的控制器的单元测试。这些是轻量级和快速的。 @Service 类等依赖项在此类测试中被模拟。
这是一个很好的起点 - https://spring.io/guides/gs/testing-web/
【解决方案2】:
这两种方式之间存在一些细微差别。
但是当你在spring boot context init过程中遇到bean初始化异常或在测试执行过程中出现NullPointerException上升等问题时,你只会随机发现其中的一部分。
为了让事情变得更简单,请关注意图。
当你写的时候:
@SpringBootTest(classes = SomeController.class)
您将使 Spring 仅初始化 SomeController bean 实例。
是否需要测试控制器?
可能没有,因为您需要一种使用控制器方法调用控制器的方法。
为此,MockMvc 实例会有所帮助。
使用 WebMvcTest,您可以在测试上下文中额外加载该 bean。
所以这种方式更可取:
@WebMvcTest(SomeController.class)
public class SomeControllerTest{
@Autowired
private MockMvc mvc;
...
}
当然,您可以使用@SpringBootTest 和一些额外的类获得类似的行为,但这只是开销:@WebMvcTest 专门的注释就足够了。
最后,为什么要让你的追随者更难阅读测试课?
通过编织一种使用 Spring Boot 测试注解的人为方式,很有机会来到那里。
【解决方案3】:
我认为要回答你的问题就足够了,只需阅读这两个注释的 Javadoc:
1. @WebMvcTest
可用于仅关注 Spring MVC 组件的 Spring MVC 测试的注解。
使用此注解将禁用完全自动配置,而仅应用与 MVC 测试相关的配置(即@Controller、@ControllerAdvice、@JsonComponent、Converter/GenericConverter、Filter、WebMvcConfigurer 和 HandlerMethodArgumentResolver bean,但不是 @Component , @Service 或 @Repository 豆子)。
默认情况下,使用@WebMvcTest 注释的测试也会自动配置 Spring Security 和 MockMvc(包括对 HtmlUnit WebClient 和 Selenium WebDriver 的支持)。要对 MockMVC 进行更细粒度的控制,可以使用 @AutoConfigureMockMvc 注释。
@SpringbootTest
可以在运行基于 Spring Boot 的测试的测试类上指定的注释。在常规 Spring TestContext Framework 之外提供以下功能:
当没有定义特定的@ContextConfiguration(loader=...) 时,使用 SpringBootContextLoader 作为默认的 ContextLoader。
不使用嵌套@Configuration 时自动搜索@SpringBootConfiguration,并且未指定显式类。
允许使用 properties 属性定义自定义环境属性。
允许使用 args 属性定义应用程序参数。
提供对不同 webEnvironment 模式的支持,包括启动在定义或随机端口上侦听的完全运行的 Web 服务器的能力。
注册一个 TestRestTemplate 和/或 WebTestClient bean,以便在使用完全运行的 Web 服务器的 Web 测试中使用。