【问题标题】: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 测试中使用。

        【讨论】:

          猜你喜欢
          • 2017-02-13
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 1970-01-01
          • 2021-12-25
          • 2020-05-10
          • 2014-09-20
          • 2010-10-28
          相关资源
          最近更新 更多