Mockito入门&QA
前言
本文基于Junit4和Mockito注解进行演示
注意导包@org.junit.Test
应用场景
在基于Springboot的项目中 我们通常通过
外部依赖注入调用实际函数
的方式进行测试 如下代码但是这样会有以下问题
- 启动Springboot应用实例耗时较长 不利于调试程序 效率低下
- 调用真实的方法不一定可以覆盖你的代码分支逻辑(如if/else switch/case) 严重受外部依赖函数返回值的影响
- 调用外部方法的时候每次都要考虑具体的入参
- 外部调用过程中出现异常不容易排查
所以我们需要一款工具 可以满足 任意的入参返回预期的假定结果 这个过程就是Mock
Mockito可以满足大多数单测场景 以下场景不适用
- Mock对象调用私有/静态方法
- Mock对象在目标类中是final修饰的
快速上手
函数含义
实战场景
模拟行为有返回值
模拟行为无返回值
模拟行为并抛出异常
模拟行为传递任意参数
模拟行为是链式的
QA(更新中...)
NPE
空指针是我们在Mock过程中 最常会遇到的 下边分析思路可作参考
- Debug查看Mock的对象是否是初始化
- Mock行为的参数是否和测试方法中的参数匹配 不匹配模拟的行为不会被执行
- 需要的参数是否没有传递给测试方法中的对象
NFE
number format exception 常见于目标测试方法有这些Long.valuOf("测试")或Long.parseLong("测试")等数字转换函数的时候
解决办法就是 外部传参数一定要注意
Test class should have exactly one public constructor
报错原因是你测试了一个没有公共方法的类 不可Mock
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
看你模拟的方法是否有返回值 doNothing()只能用于无返回值的行为
明明模拟了方法行为却没有执行
那就要分析模拟行为的参数和方法真正执行的参数是否对应 当你Mock行为的时候一定要确定参数的入参是什么 是
引用数据类型
还是基本数据类型
基本数据类型的值只能根据上文去推断出来没办法使用any相关函数 引用数据类型需要上文推断是否是null还是实例数据 any不可以模拟null