詳解Spring MVC如何測試Controller(使用springmvc mock測試)
在springmvc中一般的測試用例都是測試service層,今天我來演示下如何使用springmvc mock直接測試controller層代碼。
1.什么是mock測試?
mock測試就是在測試過程中,對(duì)于某些不容易構(gòu)造或者不容易獲取的對(duì)象,用一個(gè)虛擬的對(duì)象來創(chuàng)建以便測試的測試方法。
2.為什么要使用mock測試?
使用Mock O bject進(jìn)行測試,主要是用來模擬那些在應(yīng)用中不容易構(gòu)造(如HttpServletRequest必須在Servlet容器中才能構(gòu)造出來)或者比較復(fù)雜的對(duì)象(如JDBC中的ResultSet對(duì)象)從而使測試順利進(jìn)行的工具。
3.常用注解
RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test組件進(jìn)行單元測試;
WebAppConfiguratio: 使用這個(gè)annotation會(huì)在跑單元測試的時(shí)候真實(shí)的啟一個(gè)web服務(wù),然后開始調(diào)用Controller的Rest API,待單元測試跑完之后再將web服務(wù)停掉;
ContextConfiguration: 指定Bean的配置文件信息,可以有多種方式,這個(gè)例子使用的是文件路徑形式,如果有多個(gè)配置文件,可以將括號(hào)中的信息配置為一個(gè)字符串?dāng)?shù)組來表示;
4.安裝測試環(huán)境
spring mvc測試框架提供了兩種方式,獨(dú)立安裝和集成Web環(huán)境測試(此種方式并不會(huì)集成真正的web環(huán)境,而是通過相應(yīng)的Mock API進(jìn)行模擬測試,無須啟動(dòng)服務(wù)器)。
獨(dú)立安裝測試方式
MockMvcBuilders.standaloneSetup(Object... controllers):通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了;
主要是兩個(gè)步驟:
(1)首先自己創(chuàng)建相應(yīng)的控制器,注入相應(yīng)的依賴
(2)通過MockMvcBuilders.standaloneSetup模擬一個(gè)Mvc測試環(huán)境,通過build得到一個(gè)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; /** * 獨(dú)立安裝測試方式 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("請(qǐng)求狀態(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(); } } }
請(qǐng)求結(jié)果如下:
集成Web環(huán)境方式
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會(huì)從該上下文獲取相應(yīng)的控制器并得到相應(yīng)的MockMvc;
主要是三個(gè)步驟:
(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)建一個(gè)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("請(qǐng)求狀態(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é)果和上面獨(dú)立測試時(shí)候一樣。
總結(jié):
整個(gè)過程:
1、mockMvc.perform執(zhí)行一個(gè)請(qǐng)求;
2、MockMvcRequestBuilders.get("/user/1")構(gòu)造一個(gè)請(qǐng)求
3、ResultActions.andExpect添加執(zhí)行完成后的斷言
4、ResultActions.andDo添加一個(gè)結(jié)果處理器,表示要對(duì)結(jié)果做點(diǎn)什么事情,比如此處使用MockMvcResultHandlers.print()輸出整個(gè)響應(yīng)結(jié)果信息。
5、ResultActions.andReturn表示執(zhí)行完成后返回相應(yīng)的結(jié)果。
整個(gè)測試過程非常有規(guī)律:
1、準(zhǔn)備測試環(huán)境
2、通過MockMvc執(zhí)行請(qǐng)求
3、添加驗(yàn)證斷言
4、添加結(jié)果處理器
5、得到MvcResult進(jìn)行自定義斷言/進(jìn)行下一步的異步請(qǐng)求
6、卸載測試環(huán)境
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java 使用HttpURLConnection發(fā)送數(shù)據(jù)簡單實(shí)例
這篇文章主要介紹了java 使用HttpURLConnection發(fā)送數(shù)據(jù)簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06基于SpringBoot實(shí)現(xiàn)IP黑白名單的詳細(xì)步驟
IP黑白名單是網(wǎng)絡(luò)安全管理中常見的策略工具,用于控制網(wǎng)絡(luò)訪問權(quán)限,根據(jù)業(yè)務(wù)場景的不同,其應(yīng)用范圍廣泛,比如比較容易被盜刷的短信接口、文件接口,都需要添加IP黑白名單加以限制,所以本文給大家介紹了基于SpringBoot實(shí)現(xiàn)IP黑白名單的詳細(xì)步驟,需要的朋友可以參考下2024-01-01SpringBoot將多個(gè)文件夾進(jìn)行壓縮的兩種方法(瀏覽器下載和另存為)
Spring Boot項(xiàng)目通常不會(huì)自動(dòng)對(duì)文件夾進(jìn)行壓縮,不過,在打包應(yīng)用時(shí),如果你使用了Maven或Gradle這樣的構(gòu)建工具,并且配置了相應(yīng)的插件,可以在打成jar或war包的時(shí)候?qū)⒁蕾嚨膸煳募喜⒉嚎s,本文介紹了SpringBoot將多個(gè)文件夾進(jìn)行壓縮的兩種方法2024-07-07java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法
這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法的相關(guān)資料,在開發(fā)過程中經(jīng)常會(huì)用到String 這個(gè)類進(jìn)行操作,需要的朋友可以參考下2017-08-08SpringBoot攔截器實(shí)現(xiàn)對(duì)404和500等錯(cuò)誤的攔截
本篇文章主要介紹了SpringBoot攔截器實(shí)現(xiàn)對(duì)404和500等錯(cuò)誤的攔截,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解
在Java中List是一種常用的集合類,用于存儲(chǔ)一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下2024-07-07