中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-23 14:00:01 來源:腳本之家 閱讀:259 作者:haha12 欄目:編程語言

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

1.什么是mock測試?

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

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

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

3.常用注解

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

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

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

4.安裝測試環境

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

 獨立安裝測試方式

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

主要是兩個步驟:

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

(2)通過MockMvcBuilders.standaloneSetup模擬一個Mvc測試環境,通過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("請求狀態碼:" + status);
      String result = mvcResult.getResponse().getContentAsString();
      System.out.println("接口返回結果:" + result);
      JSONObject resultObj = JSON.parseObject(result);
      // 判斷接口返回json中success字段是否為true
      Assert.assertTrue(resultObj.getBooleanValue("success"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

} 

請求結果如下:

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

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

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

集成Web環境方式

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

主要是三個步驟:

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

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

(3)然后通過MockMvcBuilders.webAppContextSetup(wac).build()創建一個MockMvc進行測試

代碼如下:

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環境方式 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("請求狀態碼:" + status);
      String result = mvcResult.getResponse().getContentAsString();
      System.out.println("接口返回結果:" + result);
      JSONObject resultObj = JSON.parseObject(result);
      // 判斷接口返回json中success字段是否為true
      Assert.assertTrue(resultObj.getBooleanValue("success"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

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

總結:

整個過程:

1、mockMvc.perform執行一個請求;

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

3、ResultActions.andExpect添加執行完成后的斷言

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

5、ResultActions.andReturn表示執行完成后返回相應的結果。

整個測試過程非常有規律:

1、準備測試環境

2、通過MockMvc執行請求

3、添加驗證斷言

4、添加結果處理器

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

6、卸載測試環境

參考: spring-mvc-test-framework

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬莱市| 界首市| 石嘴山市| 中卫市| 化州市| 高平市| 静乐县| 东源县| 津南区| 都江堰市| 嵊州市| 大冶市| 鹿泉市| 繁峙县| 克东县| 南通市| 衡东县| 南澳县| 綦江县| 高雄市| 阜南县| 正镶白旗| 文登市| 延寿县| 玛多县| 江川县| 廉江市| 嘉黎县| 津南区| 中宁县| 孟津县| 台南县| 会同县| 平顶山市| 龙海市| 苗栗县| 惠安县| 昌吉市| 临汾市| 瑞昌市| 孝义市|