国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

詳解Spring MVC如何測試Controller(使用springmvc mock測試)

2024-07-13 10:15:39
字體:
供稿:網(wǎng)友

在springmvc中一般的測試用例都是測試service層,今天我來演示下如何使用springmvc mock直接測試controller層代碼。

1.什么是mock測試?

mock測試就是在測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,用一個虛擬的對象來創(chuàng)建以便測試的測試方法。

2.為什么要使用mock測試?

使用Mock O bject進(jìn)行測試,主要是用來模擬那些在應(yīng)用中不容易構(gòu)造(如HttpServletRequest必須在Servlet容器中才能構(gòu)造出來)或者比較復(fù)雜的對象(如JDBC中的ResultSet對象)從而使測試順利進(jìn)行的工具。

3.常用注解

RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test組件進(jìn)行單元測試;

WebAppConfiguratio: 使用這個annotation會在跑單元測試的時候真實的啟一個web服務(wù),然后開始調(diào)用Controller的Rest API,待單元測試跑完之后再將web服務(wù)停掉;

ContextConfiguration: 指定Bean的配置文件信息,可以有多種方式,這個例子使用的是文件路徑形式,如果有多個配置文件,可以將括號中的信息配置為一個字符串?dāng)?shù)組來表示;

4.安裝測試環(huán)境

spring mvc測試框架提供了兩種方式,獨立安裝和集成Web環(huán)境測試(此種方式并不會集成真正的web環(huán)境,而是通過相應(yīng)的Mock API進(jìn)行模擬測試,無須啟動服務(wù)器)。

 獨立安裝測試方式

MockMvcBuilders.standaloneSetup(Object... controllers):通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了;

主要是兩個步驟:

(1)首先自己創(chuàng)建相應(yīng)的控制器,注入相應(yīng)的依賴

(2)通過MockMvcBuilders.standaloneSetup模擬一個Mvc測試環(huán)境,通過build得到一個MockMvc

代碼如下:

package com.xfs.test;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.xfs.web.controller.APIController;/** * 獨立安裝測試方式 springmvc mock測試 * * @author admin * * 2017年11月23日 上午10:39:49 */public class TestApiOne {  private MockMvc mockMvc;  @Before  public void setUp() {    APIController apiController = new APIController();    mockMvc = MockMvcBuilders.standaloneSetup(apiController).build();  }  @Test  public void testGetSequence() {    try {      MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))                .andExpect(MockMvcResultMatchers.status().is(200))                .andDo(MockMvcResultHandlers.print())                .andReturn();      int status = mvcResult.getResponse().getStatus();      System.out.println("請求狀態(tài)碼:" + status);      String result = mvcResult.getResponse().getContentAsString();      System.out.println("接口返回結(jié)果:" + result);      JSONObject resultObj = JSON.parseObject(result);      // 判斷接口返回json中success字段是否為true      Assert.assertTrue(resultObj.getBooleanValue("success"));    } catch (Exception e) {      e.printStackTrace();    }  }} 

請求結(jié)果如下:

Spring,MVC測試Controller,springmvc,mock,測試

Spring,MVC測試Controller,springmvc,mock,測試

Spring,MVC測試Controller,springmvc,mock,測試

集成Web環(huán)境方式

MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會從該上下文獲取相應(yīng)的控制器并得到相應(yīng)的MockMvc;

主要是三個步驟:

(1)@WebAppConfiguration:測試環(huán)境使用,用來表示測試環(huán)境使用的ApplicationContext將是WebApplicationContext類型的;value指定web應(yīng)用的根

(2)通過@Autowired WebApplicationContext wac:注入web環(huán)境的ApplicationContext容器

(3)然后通過MockMvcBuilders.webAppContextSetup(wac).build()創(chuàng)建一個MockMvc進(jìn)行測試

代碼如下:

package com.xfs.test;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.mock.web.MockHttpSession;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;/** * 集成Web環(huán)境方式 springmvc mock測試 * * @author admin * * 2017年11月23日 上午11:12:43 */@RunWith(JUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations = { "classpath*:spring/*.xml" })public class TestApiTwo extends AbstractJUnit4SpringContextTests {  @Autowired  public WebApplicationContext wac;  public MockMvc mockMvc;  public MockHttpSession session;  @Before  public void before() throws Exception {    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();  }  @Test  public void testGetSequence() {    try {      MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))                .andExpect(MockMvcResultMatchers.status().is(200))                .andDo(MockMvcResultHandlers.print())                .andReturn();      int status = mvcResult.getResponse().getStatus();      System.out.println("請求狀態(tài)碼:" + status);      String result = mvcResult.getResponse().getContentAsString();      System.out.println("接口返回結(jié)果:" + result);      JSONObject resultObj = JSON.parseObject(result);      // 判斷接口返回json中success字段是否為true      Assert.assertTrue(resultObj.getBooleanValue("success"));    } catch (Exception e) {      e.printStackTrace();    }  }}

運行結(jié)果和上面獨立測試時候一樣。

總結(jié):

整個過程:

1、mockMvc.perform執(zhí)行一個請求;

2、MockMvcRequestBuilders.get("/user/1")構(gòu)造一個請求

3、ResultActions.andExpect添加執(zhí)行完成后的斷言

4、ResultActions.andDo添加一個結(jié)果處理器,表示要對結(jié)果做點什么事情,比如此處使用MockMvcResultHandlers.print()輸出整個響應(yīng)結(jié)果信息。

5、ResultActions.andReturn表示執(zhí)行完成后返回相應(yīng)的結(jié)果。

整個測試過程非常有規(guī)律:

1、準(zhǔn)備測試環(huán)境

2、通過MockMvc執(zhí)行請求

3、添加驗證斷言

4、添加結(jié)果處理器

5、得到MvcResult進(jìn)行自定義斷言/進(jìn)行下一步的異步請求

6、卸載測試環(huán)境

參考: spring-mvc-test-framework

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳东县| 吉首市| 河东区| 滁州市| 察隅县| 宜兰县| 黔江区| 巢湖市| 喀喇沁旗| 安康市| 大石桥市| 桂阳县| 元朗区| 呼玛县| 嘉善县| 调兵山市| 方山县| 平谷区| 石河子市| 格尔木市| 马龙县| 河池市| 霍州市| 县级市| 修武县| 永宁县| 广平县| 天全县| 乌苏市| 沿河| 三明市| 邓州市| 永新县| 高安市| 成武县| 辽阳县| 高陵县| 霍林郭勒市| 巧家县| 叶城县| 宜春市|