亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2017年12月29日 08:37:43   作者:haha12  
這篇文章主要介紹了詳解Spring MVC如何測試Controller(使用springmvc mock測試),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在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é)果如下:

集成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();
    }
  }

}

運(yùn)行結(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 使用HttpURLConnection發(fā)送數(shù)據(jù)簡單實例

    java 使用HttpURLConnection發(fā)送數(shù)據(jù)簡單實例

    這篇文章主要介紹了java 使用HttpURLConnection發(fā)送數(shù)據(jù)簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 基于SpringBoot實現(xiàn)IP黑白名單的詳細(xì)步驟

    基于SpringBoot實現(xiàn)IP黑白名單的詳細(xì)步驟

    IP黑白名單是網(wǎng)絡(luò)安全管理中常見的策略工具,用于控制網(wǎng)絡(luò)訪問權(quán)限,根據(jù)業(yè)務(wù)場景的不同,其應(yīng)用范圍廣泛,比如比較容易被盜刷的短信接口、文件接口,都需要添加IP黑白名單加以限制,所以本文給大家介紹了基于SpringBoot實現(xiàn)IP黑白名單的詳細(xì)步驟,需要的朋友可以參考下
    2024-01-01
  • Java?@Validated遇到的大坑與處理

    Java?@Validated遇到的大坑與處理

    這篇文章主要介紹了Java?@Validated遇到的大坑與處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java 字節(jié)流和字符流的區(qū)別詳解

    java 字節(jié)流和字符流的區(qū)別詳解

    這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot將多個文件夾進(jìn)行壓縮的兩種方法(瀏覽器下載和另存為)

    SpringBoot將多個文件夾進(jìn)行壓縮的兩種方法(瀏覽器下載和另存為)

    Spring Boot項目通常不會自動對文件夾進(jìn)行壓縮,不過,在打包應(yīng)用時,如果你使用了Maven或Gradle這樣的構(gòu)建工具,并且配置了相應(yīng)的插件,可以在打成jar或war包的時候?qū)⒁蕾嚨膸煳募喜⒉嚎s,本文介紹了SpringBoot將多個文件夾進(jìn)行壓縮的兩種方法
    2024-07-07
  • Java中的collection集合類型總結(jié)

    Java中的collection集合類型總結(jié)

    Java的集合類型都是對java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結(jié)
    2016-05-05
  • java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法

    java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法

    這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法的相關(guān)資料,在開發(fā)過程中經(jīng)常會用到String 這個類進(jìn)行操作,需要的朋友可以參考下
    2017-08-08
  • SpringBoot攔截器實現(xiàn)對404和500等錯誤的攔截

    SpringBoot攔截器實現(xiàn)對404和500等錯誤的攔截

    本篇文章主要介紹了SpringBoot攔截器實現(xiàn)對404和500等錯誤的攔截,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java讀取圖片EXIF信息的方法

    Java讀取圖片EXIF信息的方法

    這篇文章主要介紹了Java讀取圖片EXIF信息的方法,較為詳細(xì)的分析了圖片EXIF信息的概念、功能及java讀取EXIF信息的實現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解

    在Java中List是一種常用的集合類,用于存儲一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下
    2024-07-07

最新評論