单元测试
00 min
2024-8-21

Mockito入门&QA

前言

本文基于Junit4和Mockito注解进行演示
注意导包@org.junit.Test

应用场景

在基于Springboot的项目中 我们通常通过外部依赖注入调用实际函数的方式进行测试 如下代码
但是这样会有以下问题
  • 启动Springboot应用实例耗时较长 不利于调试程序 效率低下
  • 调用真实的方法不一定可以覆盖你的代码分支逻辑(如if/else switch/case) 严重受外部依赖函数返回值的影响
  • 调用外部方法的时候每次都要考虑具体的入参
  • 外部调用过程中出现异常不容易排查
所以我们需要一款工具 可以满足 任意的入参返回预期的假定结果 这个过程就是Mock
Mockito可以满足大多数单测场景 以下场景不适用
  • Mock对象调用私有/静态方法
  • Mock对象在目标类中是final修饰的

快速上手

函数含义

实战场景

模拟行为有返回值

模拟行为无返回值

模拟行为并抛出异常

模拟行为传递任意参数

模拟行为是链式的

QA(更新中...)

NPE

空指针是我们在Mock过程中 最常会遇到的 下边分析思路可作参考
  1. Debug查看Mock的对象是否是初始化
  1. Mock行为的参数是否和测试方法中的参数匹配 不匹配模拟的行为不会被执行
  1. 需要的参数是否没有传递给测试方法中的对象

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
上一篇
DDD
下一篇
Sodility语言