- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- SpringMVC框架如何與Junit整合看這個(gè)就夠了
<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個(gè)依賴(lài),其中:
@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; } } }
代碼說(shuō)明
getMockResultStr 方法是封裝了公共的測試方法以及響應參數。 其中:
MvcResult mvcResult = this.mockMvc .perform(requestBuilder) .andExpect(status().isOk()) .andDo(MockMvcResultHandlers.print()) .andReturn();
返回結果的content-type是application/json的請求的單元測試
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請求的測試就是調用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);
發(fā)送一個(gè)json格式的數據到Controller層
String requestJson = JSONObject.toJSONString(folderInfo); MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("http://v1/works/save").contentType(MediaType.APPLICATION_JSON).content(requestJson);
那么,問(wèn)題來(lái)了,如果一個(gè)接口的返回結果是視圖,那么這個(gè)接口的單元測試該如何寫(xiě)呢?比如下面這個(gè)接口:
@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("角標編輯頁(yè)面返回成功"); return "manage/superScript/edit"; }
這個(gè)接口返回的是一個(gè)視圖,就是名稱(chēng)為edit.jsp頁(yè)面。它的測試方法可以像下面這樣寫(xiě)。
@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()); }
通過(guò)mvcResult.getModelAndView().getViewName()獲取視圖的名稱(chēng)。
上面的那些測試針對的都是Controller層的接口,那么如果要測試一個(gè)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類(lèi)也可以通過(guò)@Autowired 注解直接注入進(jìn)Spring IOC容器中。拿到被測試類(lèi)的實(shí)例之后就可以直接調用被測試的方法,是不是灰常的簡(jiǎn)單呀。
本文詳細介紹在SpringMVC任何使用Junit框架。首先介紹了如何引入依賴(lài),接著(zhù)介紹了編寫(xiě)一個(gè)測試基類(lèi),并且對其中涉及的各個(gè)注解做了一個(gè)詳細說(shuō)明。最后就是羅列了各種測試情況。
到此這篇關(guān)于SpringMVC框架如何與Junit整合看這個(gè)就夠了的文章就介紹到這了,更多相關(guān)SpringMVC整合Junit內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站