Spring、Spring Boot和TestNG測試指南 - 測試Spring MVC

小編:啊南 51閱讀 2020.11.19

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"));

  }

}
關聯標簽:
华东15选5彩票奖结果 足球竞彩混合过关 p3试机号彩宝网 2021 期货投资分析 重庆时时彩算法公式 重庆幸运农场开奖预测 捕鸟达人电脑版下载 如果彩开彩现场 山东11选5遗漏彩乐乐 ag竞咪厅_点进进入 河南22选5今天预测号 浙江快乐12任六遗漏 辉煌街机水果拉霸 江西多乐彩开奖走势图 比特币汇率 cmd体育拒绝 大乐透139期历史同期汇总