您好,我是碼農飛哥,感謝您閱讀本文!如果此文對您有所幫助,請毫不猶豫的一鍵三連吧!本文主要介紹在SpringMVC框架整合Junit框架進行單元測驗,閑話少述,讓我們直入主題,

文章目錄
- 系統環境
- 引入依賴
- 撰寫單元測驗基類
- 代碼說明
- MockMvcRequestBuilders
- 回傳結果的content-type是application/json的請求的單元測驗
- get請求測驗
- post請求測驗
- 檔案上傳測驗
- 發送一個json格式的資料到Controller層
- 回傳結果是視圖請求的單元測驗
- 直接測驗一個service的方法
- 總結
系統環境
| 軟體 | 版本 |
|---|---|
| spring-webmvc | 4.3.6.RELEASE |
| spring-test | 4.3.6.RELEASE |
| junit | 4.12 |
引入依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
如上,引入了4個依賴,其中:
- junit 是Junit單元測驗的基礎依賴,它提供了@RunWith和@Test等單元測驗必備的注解,
<scope>test</scope>則指明了該依賴的作用范圍是test階段, - spring-test依賴可以理解成是spring框架與junit框架的橋梁,提供了
@WebAppConfiguration等注解,
撰寫單元測驗基類
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("file:src/test/java/spring-config.xml")
@ActiveProfiles("dev")
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public abstract class BaseControllerTest {
protected MockMvc mvc;
@Autowired
private WebApplicationContext context;
//獲取系統背景關系
protected WebApplicationContext getCtx() {
return this.context;
}
//初始化方法
@Before
public void setup() throws SQLException {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
//封裝回傳結果
protected String getMockResultStr(MockHttpServletRequestBuilder requestBuilder) {
try {
MvcResult mvcResult = this.mockMvc
.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
return response.getContentAsString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
代碼說明
@RunWith(SpringJUnit4ClassRunner.class)注解表明使用SpringJUnit4ClassRunner來運行測驗用例,@WebAppConfiguration注解表明使用的ApplicationContext將是WebApplicationContext型別的;value屬性指定web應用的根;同時,他必須與@ContextConfiguration一同使用,@ContextConfiguration注解的作用是匯入我們需要的組態檔或者類,這里指定了SpringMVC的組態檔@ActiveProfiles注解是指定單元測驗連接的環境,@TransactionConfiguration注解是用與管理spring事務的,- MockHttpServletRequest 類為了模擬HttpServletRequest 物件,可以通過它來設定請求頭,這在需要鑒權的介面測驗中十分實用,
- MockMvc 實作了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測驗速度快,不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便,
getMockResultStr 方法是封裝了公共的測驗方法以及回應引數, 其中:
MvcResult mvcResult = this.mockMvc
.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
- perform方法是執行一個RequestBuilder請求,呼叫Controller的業務處理邏輯,
- andExpect 方法是添加執行完成后的斷言,添加ResultMatcher驗證規則,驗證控制器執行完成后結果是否正確,此處是驗證狀態是否是200
- andDo 方法是添加一個結果處理器,比如再此處是
andDo(MockMvcResultHandlers.print())輸出整個回應結果資訊,可以在除錯的時候使用, - andReturn:方法是執行完成后回傳相應的結果,
MockMvcRequestBuilders
- RequestBuilder是用來構建請求的,其提供了一個方法buildRequest(ServletContext servletContext) 用于構建MockHttpServletRequest; 其主要有兩個子類MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(檔案上傳時使用),即用來mock客戶端請求需要的所有資料,
- 主要API有MockHttpServletRequestBuilder.get(String urlTemplate, Object… urlVariables): 根據uri模板和uri變數值得到一個GET請求方式的RequestBuilder,如果在controller的方法中method選擇的是RequestMethod.GET,那在controllerTest中對應就要使用MockMvcRequestBuilders.get,
- MockHttpServletRequestBuilder.post(String urlTemplate, Object… urlVariables):同get類似,但是是post方法,通過param 方法來設定請求引數,
回傳結果的content-type是application/json的請求的單元測驗
get請求測驗
get請求的測驗就是呼叫MockMvcRequestBuilders的get方法, 在該方法中傳入介面地址,
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/v1/works/lineup/set")
.param("id", "123")
.param("first_flag", String.valueOf(true));
String result = getMockResultStr(requestBuilder);
post請求測驗
post請求的測驗就是呼叫MockMvcRequestBuilders的post方法, 在該方法中傳入介面地址,
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/v1/blockly/copy")
.param("id", "1211");
success(requestBuilder);
檔案上傳測驗
檔案上傳的測驗就是呼叫MockMvcRequestBuilders的multipart方法, 在該方法中傳入介面地址,
File file = new File(RestArmWorksControllerTest.class.getClassLoader().getResource("20201102172053.png").toURI());
MockMultipartFile mockMultipartFile = new MockMultipartFile("file", "20201102172053.png", "", new FileInputStream(file));
MockMultipartHttpServletRequestBuilder servletRequestBuilder = MockMvcRequestBuilders.multipart("/creation/fileUpload.do")
.file(mockMultipartFile);
String result = getMockResultStr(servletRequestBuilder);
發送一個json格式的資料到Controller層
String requestJson = JSONObject.toJSONString(folderInfo);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("//v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);
回傳結果是視圖請求的單元測驗
那么,問題來了,如果一個介面的回傳結果是視圖,那么這個介面的單元測驗該如何寫呢?比如下面這個介面:
@RequestMapping(value = "/edit")
public String edit(ModelMap model, HttpServletRequest request, HttpServletResponse response) {
Long scriptId = null;
if (StringUtils.isNotBlank(request.getParameter("scriptId"))) {
scriptId = Long.parseLong(request.getParameter("scriptId"));
}
if (scriptId != null) {
MallSuperscript mallSuperscript = superScriptService.getScriptById(scriptId);
model.addAttribute("superScript", mallSuperscript);
}
model.addAttribute("scriptTypeMap", ScriptType.toMap());
logger.info("角標編輯頁面回傳成功");
return "manage/superScript/edit";
}
這個介面回傳的是一個視圖,就是名稱為edit.jsp頁面,它的測驗方法可以像下面這樣寫,
@Test
public void testEdit() throws Exception {
MvcResult mvcResult = mvc
.perform(
get("/manage/tab2/superScript/edit").sessionAttr("adminid", "1111")
.sessionAttr("platformid", 1001L).param("scriptId", "1111"))
.andExpect(status().isOk()).andDo(print()).andReturn();
assertEquals("manage/superScript/edit", mvcResult.getModelAndView().getViewName());
}
通過mvcResult.getModelAndView().getViewName()獲取視圖的名稱,
直接測驗一個service的方法
上面的那些測驗針對的都是Controller層的介面,那么如果要測驗一個service層的方法,該如何處理呢?
public class MallMailJobTest extends BaseControllerTest {
private MallMailJob mallMailJob;
@Override
@Before
public void setup() throws SQLException {
super.setup();
mallMailJob = getCtx().getBean(MallMailJob.class);
}
/**
*
* @throws Exception
*/
@Test
public void testExecute() throws Exception {
mallMailJob.execute();
}
被測驗的MallMailJob類也可以通過@Autowired 注解直接注入進Spring IOC容器中,拿到被測驗類的實體之后就可以直接呼叫被測驗的方法,是不是灰常的簡單呀,

總結
本文詳細介紹在SpringMVC任何使用Junit框架,首先介紹了如何引入依賴,接著介紹了撰寫一個測驗基類,并且對其中涉及的各個注解做了一個詳細說明,最后就是羅列了各種測驗情況,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/283087.html
標籤:java
