1. Mock测试介绍
- 定义
在单元测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟对象来创建以便测试的方法。 - 为什么使用mock测试
- 避免模块开发之间的耦合;
- 轻量、简便、灵活;
2. MockMVC介绍
基于RESTful风格的SpringMVC单元测试,可以测试完整的SpringMVC流程,即从URL请求到控制处理器,带到视图渲染都可以测试。
2.1 MockMvc
- 服务器端SpringMVC测试的主入口点。
- 通过MockMVCBuilders建造者的静态方法去建造MockMVCBuilder,MockMvc由MockMVCBuilder构造。
- 核心方法:perform(RequestBuilder rb),执行一个RequestBuilder请,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions。
2.2 MockMVCBuilder
- MockMVCBuilder是使用构造者模式来构造MockMvc的构造器。
- 主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
- 可以直接使用静态工厂MockMvcBuilders创建即可,不需要直接使用上面两个实现类。
2.3 MockMVCBuilders
- 负责创建MockMVCBuilder对象。
- 有两种创建方式
- standaloneSetup(Object... controllers): 通过参数指定一组控制器,这样就不需要从上下文获取了。
- webAppContextSetup(WebApplicationContext wac):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc
2.4 MockMvcRequestBuilders
- 用来构建Request请求的。
- 其主要有两个子类MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。
2.5 ResultActions
- andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
- andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台。
- andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理。
- MockMvcResultMatchers
- 用来匹配执行完请求后的**结果验证。
- 果匹配失败将抛出相应的异常。
- 包含了很多验证API方法。
- MockMvcResultHandlers
- 结果处理器,表示要对结果做点什么事情。
- 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
2.6 MvcResult
单元测试执行结果,可以针对执行结果进行自定义验证逻辑。采用断言验证数据。
代码如下:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.json.JSONArray; import org.json.JSONObject; 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.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 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.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import com.boke.Application; /** * 演示MockMVC使用 * @author zenglingsheng */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @WebAppConfiguration @SpringBootTest(classes=Application.class) public class NewApiControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() throws Exception { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void testEquipmenttypes() throws Exception { MvcResult authResult = null; authResult = mockMvc.perform(get("/api/workitem/equipmenttypes")//使用get方式来调用接口。 .contentType(MediaType.APPLICATION_XHTML_XML)//请求参数的类型 .param("sessionid", "ZlbpLxXw")//请求的参数(可多个) ).andExpect(status().isOk()) .andReturn(); //获取数据 JSONObject jsonObject =new JSONObject(authResult.getResponse().getContentAsString()); JSONArray jsonArrayData = (JSONArray)jsonObject.get("data"); //获取第一个Array中的值,判断查询到的结果。 JSONObject jsonObject_data = null; if(jsonArrayData.length()>0){ jsonObject_data = (JSONObject) jsonArrayData.get(0); } //加断言,判断属性值的问题。 Assert.assertNotNull(jsonObject.get("error_code")); Assert.assertEquals(jsonObject.get("error_code"),0); Assert.assertNotNull(jsonObject.get("error_msg")); Assert.assertEquals(jsonObject.get("error_msg"),"操作成功"); Assert.assertNotNull(jsonObject.get("data")); Assert.assertNotNull(jsonObject_data); Assert.assertEquals(jsonObject_data.get("equipmentty"),1); Assert.assertEquals(jsonObject_data.get("equipmenttypename"),"xxxxx"); } }
这是根据项目所测试的具体格式,测试数据时,测试到数据的最底层。萌新一枚,大神勿喷。
关联文章:https://www.jianshu.com/p/94e5de3f28c9