Mock我的总结

前言

最近在进行单元测试的时候使用到了mock方法,同时经过老师的讲解也大体理解了单元测试的过程,下面对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的框架

咱们了解完Mock后,那什么是Mockito,什么是MockMvc呢,他们都是Mock的框架,其中,Mockito是Mock应用最普遍的框架。mvc

MockMvc

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

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方法不只使测试时更加快速准确,也知足了先后端分离测试的需求,让咱们的测试更加简单。这是这一周与同伴们和老师共同窗习的结果和总结,感谢个人同伴们和老师。

相关文章
相关标签/搜索