您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用MockMvc進行controller層單元測試,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto.account.CreateAccountReq; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvcBuilder; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; 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.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; import static org.junit.Assert.*; /** * created by wyz on 2019/5/6 */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class AccountControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; private String url = "/ms_backend/account/"; @Before public void setUp() throws Exception{ //初始化MockMvc對象 mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } //GET 請求 @Test public void accountList() throws Exception { MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get(url + "accountList") .param("companyName", "wang") .header("access_token", "accessToken"); mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON_UTF8); ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder); resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8"); resultActions.andExpect(MockMvcResultMatchers.status().isOk()); resultActions.andDo(MockMvcResultHandlers.print()); } @Test public void removeAccount() { } //post 請求 @RequestBody @Test @Transactional @Rollback() // 事務自動回滾,默認是true。可以不寫 public void createAccount() throws Exception { CreateAccountReq req = new CreateAccountReq(); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post(url + "createAccount") .header("access_token", "accessToken"); mockHttpServletRequestBuilder.accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON_UTF8) .content(new Gson().toJson(req)); // post請求 ResultActions resultActions = mockMvc.perform(mockHttpServletRequestBuilder); resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8"); resultActions.andExpect(MockMvcResultMatchers.status().isOk()); resultActions.andDo(MockMvcResultHandlers.print()); } }
在使用JUnit做單元測試時,為了使測試數據不對數據庫造成污染,故選取了spring-test進行單元測試,但在進行dao層的測試時,發現save方法無法進行數據的自動回滾。
逐一進行檢查分析,事務也開啟了,并使用注解方式標記@RollBack(true),在控制臺中也打出了事務回滾的信息,但仍然不能自動回滾。
后來感覺是數據庫的原因,我的數據庫使用的是MySql,這就存在數據表的類型是否支持事務情況。
逐查閱MySql相關文檔,發現,InnoDB類型的表是支持事務的,而MyISAM是不支持事務的,立刻查看數據表類型,果然為MyISAM,改為InnoDB后,重新進行測試,問題得到解決。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用MockMvc進行controller層單元測試”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。