索鸟网

  1. 首页
  2. Spring、Spring Boot和TestNG测试指南 - 测试Spring MVC

Spring、Spring Boot和TestNG测试指南 - 测试Spring MVC


Github地址

Spring Testing Framework提供了Spring MVC Test Framework,能够很方便的来测试Controller。同时Spring Boot也提供了Auto-configured Spring MVC tests更进一步简化了测试需要的配置工作。

本章节将分别举例说明在不使用Spring Boot和使用Spring Boot下如何对Spring MVC进行测试。

例子1:Spring

测试Spring MVC的关键是使用MockMvc对象,利用它我们能够在不需启动Servlet容器的情况下测试Controller的行为。

源代码SpringMvc_1_Test.java

@EnableWebMvc
@WebAppConfiguration
@ContextConfiguration(classes = { FooController.class, FooImpl.class })
public class SpringMvc_1_Test extends AbstractTestNGSpringContextTests {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mvc;

  @BeforeMethod
  public void prepareMockMvc() {
    this.mvc = webAppContextSetup(wac).build();
  }

  @Test
  public void testController() throws Exception {

    this.mvc.perform(get("/foo/check-code-dup").param("code", "123"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(content().string("true"));

  }

}

在这段代码里,主要有三个步骤:

  1. 将测试类标记为@WebAppConfiguration

  2. 通过webAppContextSetup(wac).build()构建MockMvc

  3. 利用MockMvc对结果进行判断

例子2:Spring + Mock

在例子1里,FooController使用了一个实体FooImpl的Bean,实际上我们也可以提供一个Foo的mock bean来做测试,这样就能够更多的控制测试过程。如果你还不知道Mock那么请看Chapter 3: 使用Mockito

源代码SpringMvc_2_Test.java

@EnableWebMvc
@WebAppConfiguration
@ContextConfiguration(classes = { FooController.class })
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
public class SpringMvc_2_Test extends AbstractTestNGSpringContextTests {

  @Autowired
  private WebApplicationContext wac;

  @MockBean
  private Foo foo;

  private MockMvc mvc;

  @BeforeMethod
  public void prepareMockMvc() {
    this.mvc = webAppContextSetup(wac).build();
  }

  @Test
  public void testController() throws Exception {

    when(foo.checkCodeDuplicate(anyString())).thenReturn(true);

    this.mvc.perform(get("/foo/check-code-dup").param("code", "123"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(content().string("true"));

  }

}

例子3:Spring Boot

Spring Boot提供了@WebMvcTest更进一步简化了对于Spring MVC的测试,我们提供了对应例子1的Spring Boot版本。

源代码BootMvc_1_Test.java

@WebMvcTest
@ContextConfiguration(classes = { FooController.class, FooImpl.class })
public class BootMvc_1_Test extends AbstractTestNGSpringContextTests {

  @Autowired
  private MockMvc mvc;

  @Test
  public void testController() throws Exception {

    this.mvc.perform(get("/foo/check-code-dup").param("code", "123"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(content().string("true"));

  }

}

在这里,我们不需要自己构建MockMvc,直接使用@Autowired注入就行了,是不是很方便?

例子4:Spring Boot + Mock

这个是对应例子2的Spring Boot版本,源代码BootMvc_2_Test.java

@WebMvcTest
@ContextConfiguration(classes = { FooController.class })
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
public class BootMvc_2_Test extends AbstractTestNGSpringContextTests {

  @Autowired
  private MockMvc mvc;

  @MockBean
  private Foo foo;

  @Test
  public void testController() throws Exception {

    when(foo.checkCodeDuplicate(anyString())).thenReturn(true);

    this.mvc.perform(get("/foo/check-code-dup").param("code", "123"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(content().string("true"));

  }

}

参考文档

java test spring spring-boot

来源地址:https://segmentfault.com/a/1190000010813240 版权归作者所有!

相关教程

  • Spring、Spring Boot和TestNG测试指南 - 测试AOP

    Github地址 Spring提供了一套AOP工具,但是当你把各种Aspect写完之后,如何确定这些Aspect都正确的应用到目标Bean上了呢?本章将举例说明如何对Spring AOP做测试。 首先先来看我们事先定义的Bean以及Aspect。 FooServiceImpl: @Component public class FooServiceImpl
  • Spring、Spring Boot和TestNG测试指南 - 测试@Configuration

    Github地址 在Spring引入Java Config机制之后,我们会越来越多的使用@Configuration来注册Bean,并且Spring Boot更广泛地使用了这一机制,其提供的大量Auto Configuration大大简化了配置工作。那么问题来了,如何确保@Configuration和Auto Configuration按照预期运行呢,是
  • Spring、Spring Boot和TestNG测试指南 - @JsonTest

    Github地址 @JsonTest是Spring Boot提供的方便测试JSON序列化反序列化的测试工具,在Spring Boot的文档中有一些介绍。 需要注意的是@JsonTest需要Jackson的ObjectMapper,事实上如果你的Spring Boot项目添加了spring-web的Maven依赖,JacksonAutoConfigurat
  • Spring、Spring Boot和TestNG测试指南 - @TestPropertySource

    Github地址 @TestPropertySource可以用来覆盖掉来自于系统环境变量、Java系统属性、@PropertySource的属性。 同时@TestPropertySource(properties=...)优先级高于@TestPropertySource(locations=...)。 利用它我们可以很方便的在测试代码里微调、模拟配置(比
  • Spring、Spring Boot和TestNG测试指南 - @OverrideAutoConfiguration

    Github地址 在Chapter 1: 基本用法 - 使用Spring Boot Testing工具里提到: 除了单元测试(不需要初始化ApplicationContext的测试)外,尽量将测试配置和生产配置保持一致。比如如果生产配置里启用了AutoConfiguration,那么测试配置也应该启用。因为只有这样才能够在测试环境下发现生产环境的问题,也
  • Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles

    Github地址 @ActiveProfiles可以用来在测试的时候启用某些Profile的Bean。本章节的测试代码使用了下面的这个配置: @Configuration public class Config { @Bean @Profile("dev") public Foo fooDev() { return new Foo(
  • Spring、Spring Boot和TestNG测试指南 - @TestConfiguration

    Github地址 @TestConfiguration是Spring Boot Test提供的一种工具,用它我们可以在一般的@Configuration之外补充测试专门用的Bean或者自定义的配置。 @TestConfiguration实际上是一种@TestComponent,@TestComponent是另一种@Component,在语义上用来指定某个
  • Spring、Spring Boot和TestNG测试指南 - 共享测试配置

    Github地址 在使用Spring Boot Testing工具中提到: 在测试代码之间尽量做到配置共用。...能够有效利用Spring TestContext Framework的缓存机制,ApplicationContext只会创建一次,后面的测试会直接用已创建的那个,加快测试代码运行速度。 本章将列举几种共享测试配置的方法 @Configurat