最近在进行单元测试的时候使用到了mock方法,同时经过老师的讲解也大体理解了单元测试的过程,下面对mock进行一些总结。前端
mock中文翻译为虚假的,不真实的。
人如其名,mock是在测试过程当中,对于一些不容易构造/获取的对象,建立一个mock对象来模拟对象的行为。
什么是复杂的对象后端
class A 依赖 class B class B 依赖 class C和class D class C 依赖 ... class D 依赖 ...
被测对象依赖的对象构造复杂。咱们想对class A进行单元测试,须要构造大量的class B、C、D等依赖对象,他们的构造过程复杂,这时咱们能够利用mock去构造虚拟的class B、C、D对象用于class A的测试,由于咱们只是想测试class A的行为是否符合预期,咱们并不须要测试依赖对象。
另外,若是须要引入的的模块开发还没有完成,咱们又须要在单元测试中使用,咱们也能够用Mock方法来代替。网络
咱们了解完Mock后,那什么是Mockito,什么是MockMvc呢,他们都是Mock的框架,其中,Mockito是Mock应用最普遍的框架。mvc
MockMvc实现对Http请求的模拟,能够方便对Controller进行测试,使得测试速度快、不依赖网络环境。咱们不用再依赖前端的代码,从而实现了先后端分离,独立测试。
常见使用方式
1 MockMvcBuilder构造MockMvc的构造器框架
2 MockMvcRequestBuilders建立请求request前后端分离
3 mockMvc调用perform,执行一个request请求,调用controller的业务处理逻辑,返回ResultActions函数
4 对结果进行验证
咱们看教程中的代码实际上是合在一块儿去写post
@Test public void save() throws Exception { String url = "/Student"; JSONObject studentJsonObject = new JSONObject(); JSONObject klassJsonObject = new JSONObject(); studentJsonObject.put("sno", "学号测试"); studentJsonObject.put("name", "姓名测试"); klassJsonObject.put("id", -1); studentJsonObject.put("klass", klassJsonObject); MvcResult mvcResult = this.mockMvc.perform( MockMvcRequestBuilders.post(url) .content(studentJsonObject.toString()) .contentType(MediaType.APPLICATION_JSON_UTF8) ).andExpect(MockMvcResultMatchers.status().is(201)) .andReturn(); }
咱们将其中的测试拆分出来看看单元测试
// 构建请求 MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(url) .content(studentJsonObject.toString()) .contentType(MediaType.APPLICATION_JSON_UTF8); // 发送请求,获取请求结果 ResultActions perform = mvc.perform(request); // 请求结果校验 perform.andExpect(MockMvcResultMatchers.status().is(201)); MvcResult mvcResult = perform.andReturn();
Mockito能够理解为mock input to output。咱们只关心input与output,也就是输入与输出,中间的过程实现咱们并不关心,从而实现了对复杂对象的简单化。
前端传给c层咱们利用MockMvc模拟,那测试C层与M层的数据传输咱们能够利用Mockito来模拟。
咱们经常使用方法以下学习
Mockito.when( studentService.save( Mockito.any(Student.class))) .thenReturn(returnStudent);
当调用studentService.save()方法时并传入一个Student类型的参数,就去返回returnStudent。这个的returnStudent使咱们去设定的。
咱们的save方法定义就是传入一个Student类型的参数,为何后面还会设定Mockito.any(Student.class)
呢,这是由于函数可能重载,咱们规定传入参数防止产生歧义,固然这里咱们没有进行重载。
Mock方法不只使测试时更加快速准确,也知足了先后端分离测试的需求,让咱们的测试更加简单。这是这一周与同伴们和老师共同窗习的结果和总结,感谢个人同伴们和老师。