前言
单元测试是 Java 开发过程中必不可少的一种技术手段,行覆盖很高的单测可以防止一些低级 Bug 提高代码的质量,在维护老的复杂项目的时候,修改一行代码可能会牵扯到很多的模块,一些潜在的低级 Bug 很可能会被忽略然后被部署到日常环境,浪费测试同事的时间也浪费开发的时间,但是有了高覆盖率的单测就不一样了,我们修改一行代码单测可以自动检测出哪些模块受到了影响,从而为我们节省了宝贵的时间。
Mockito
平常项目开发中我们要测试的类总会依赖其他的对象,而被依赖的对象又会依赖更多的对象,或者测试类依赖外部资源比如数据库、Redis、MQ、网络等等,这样就使得单元测试变得极其复杂,为了测试一个接口就去修改数据库的值,为了测试网络相关的接口就修改真实的网络情况。然而引入 Mockito 单测就会变得简单很多,我们可以把类依赖的对象或者外部资源全部都 mock 掉,Mockito 可以对依赖的类的指定方法进行 mock,返回特定的测试值、拦截入参甚至还可以抛出指定异常。
另外 Mockito 还可以提高测试用例的运行速度和提升测试效率,没有了外部网络的访问或者跨系统的调用,测试用例的运行速度可以降至毫秒级,而且开发人员也不需要共用一套测试数据库依赖,甚至不需要为测试用例准备单独的测试数据,测试用例之间彼此独立,自然就提高了测试的效率。
PowerMock
Mock 框架 Mockito 和 EasyMock 虽然给我们带来了解除外部资源的依赖、提高测试用例的运行速度和效率的好处,但是仍然有自己的局限性,比如不能对 final、private、static 方法进行 mock。PowerMock 在这些 Mock 框架的基础上做了扩展,解决了它们的局限性实现了额外的功能。
Mockito 注解的基本使用
我们先看下 Mockito 的注解的基本使用。由于 Service 类中注入了 Mapper 类,所以需要对 Mapper 进行 mock,再把 mock 后的 Mapper 代理对象注入到 Service 类中。