mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为。比如说你需要调用B服务,可是B服务还没有开发完成,那么你就可以将调用B服务的那部分给Mock掉,并编写你想要的返回结果。 Mock有很多的实现框架,例如Mockito、EasyMock、Jmockit、PowerMock、Spock等等,SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了。本文代码基于jdk8、junit5、Mockito3

1.1、 Mockito中文文档

Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,它可读性强和验证语法简洁。Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发! Mockito具体使用方法见文档https://github.com/hehonghui/mockito-doc-zh#0

1.2、Mockito基本使用方法简介

1)、静态导入会使代码更简洁


import static


举例:


//创建mock对象,mock一个List接口


2)、验证某些行为


//你可以mock一个具体的类型,而不仅是接口


一旦mock对象被创建了,mock对象会记住所有的交互。然后你就可能选择性的验证你感兴趣的交互。

3)、如何做一些测试桩


//测试桩


4)、其他使用见上面文档

2、MockMVC基于RESTful风格的测试

对于前后端分离的项目而言,无法直接从前端静态代码中测试接口的正确性,因此可以通过MockMVC来模拟HTTP请求。基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试。

2.1、初始化MockMvc对象


@Autowired


2.2、完成一些接口的测试

1)、尝试测试一个不存在的请求 /user/1


/**


展示结果:


Java mock sleep java mock sleep抛异常_返回结果


2)、在Controller中完成 /user/{id}


/**


修改一下测试类:期待返回的结果是200


@Test


结果展示:


Java mock sleep java mock sleep抛异常_mock 抛出一个异常如何终止_02


3)、我们可以把结果打印到控制台


// 期望的结果状态 200


运行结果:可以看到并没有返回结果


Java mock sleep java mock sleep抛异常_mockito mock void方法_03


4)、结合Mockito构建自定义返回结果

这里就用到了Mockito的应用场景,userService.getById并没有返回结果,但是我们的测试并不关心userService.getById这个方法是否正常,只是在我们的测试中需要用到这个方法,所以我们可以Mock掉UserService的getById方法,自己定义返回的结果,继续我们的测试。


@MockBean


运行结果


Java mock sleep java mock sleep抛异常_mockito mock void方法_04


5)、传参数


@Test


6)、期望返回结果集有两个元素


@Test


运行结果:


Java mock sleep java mock sleep抛异常_mock 抛出一个异常如何终止_05


7)、测试Post请求


@Test


3、一些常用API总结

常用的期望:


//使用jsonPaht验证返回的json中code、message字段的返回值


附带常用API解释:

RequestBuilder/MockMvcRequestBuilders:


//根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;


MockHttpServletRequestBuilder:


//:添加头信息;


MockMultipartHttpServletRequestBuilder


//:指定要上传的文件;


ResultActions


//:添加验证断言来判断执行请求后的结果是否是预期的;


ResultMatcher/MockMvcResultMatchers


//:请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器;