使用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()); } }
Spring-test 单元测试数据不自动回滚的解决方案
在使用JUnit做单元测试时,为了使测试数据不对数据库造成污染,故选取了spring-test进行单元测试,但在进行dao层的测试时,发现save方法无法进行数据的自动回滚。
逐一进行检查分析,事务也开启了,并使用注解方式标记@RollBack(true),在控制台中也打出了事务回滚的信息,但仍然不能自动回滚。
后来感觉是数据库的原因,我的数据库使用的是MySql,这就存在数据表的类型是否支持事务情况。
逐查阅MySql相关文档,发现,InnoDB类型的表是支持事务的,而MyISAM是不支持事务的,立刻查看数据表类型,果然为MyISAM,改为InnoDB后,重新进行测试,问题得到解决。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)