当前位置: 首页 > news >正文

java之 junit4单元测试Mockito的使用

一 mockito的使用

1.1 mockito介绍

Mockito是一个用于Java单元测试的mock框架,用于创建模拟对象(mock object)来替代真实对象,帮助开发者隔离外部依赖,从而专注于单元测试的逻辑,Mockito通常配合单元测试框架(如JUnit)使用。

1.2 坐标的引入

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

二  验证行为

2.1 验证行为

使用verify()检查mock对象的特定方法是否被调用,参数和调用次数是否符合预期

Mockito 的 verify() 用于验证模拟对象的方法是否按预期被调用,包括调用次数、参数匹配等。它支持精确验证(如 times(2))、最少/最多次数(atLeast()/atMost())、未调用(never())及顺序验证(结合 InOrder)等,确保代码执行逻辑正确。

2.2 案例

2.2.1 案例代码

package com.ljf.services;import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;import java.util.List;import static org.mockito.Mockito.*;/*** @ClassName: MockTest* @Description: TODO* @Author: admin* @Date: 2025/08/17 17:19:09 * @Version: V1.0**/
@RunWith(MockitoJUnitRunner.class)
public class MockTest {@MockList<String> strList;@Testpublic void test(){strList.add("bj");strList.add("sh");strList.add("sz");// 模拟调用// 1. 验证方法被调用【恰好一次】(默认行为)verify(strList).add("bj");strList.add("bj");// 2. 验证方法被调用【指定次数】verify(strList, times(2)).add("bj"); // 精确2次// 3. 验证方法【从未调用】verify(strList, never()).clear();// 4. 验证【调用顺序】InOrder inOrder = inOrder(strList);inOrder.verify(strList).add("bj");inOrder.verify(strList).add("sh");inOrder.verify(strList).add("sz");verifyNoMoreInteractions(strList);}
}

2.2.2  说明

验证单次调用:verify(strList).add("bj");→ 检查 add("bj") 被调用 1 次。
验证精确次数:verify(strList, times(2)).add("bj");→ 检查 add("bj") 被调用 2 次。
验证禁止调用:verify(strList, never()).clear();→ 确保 clear() 方法从未调用。
验证调用顺序:
 InOrder inOrder = inOrder(strList);
 inOrder.verify(strList).add("bj");
 inOrder.verify(strList).add("sh");
 inOrder.verify(strList).add("sz");

三  打桩

3.1 打桩

打桩:可以模拟数据库、网络请求等复杂或不可控的操作。无论调用多少次,一旦被打桩,方法将返回指定的值。模拟对象(Mock)的方法调用预设返回值或行为,使得测试代码可以隔离外部依赖,并控制方法的输出或异常

3.2 api说明

默认情况下,对于所有返回值的方法,mock对象将返回适当的默认值。例如,对于intInteger返回0,对于booleanBoolean返回false,对于集合类型返回空集合,对于其他对象类型(例如字符串)返回null

参数匹配器:使用 any()eq() 等灵活匹配参数,但需注意参数一致性(不能混用具体值和匹配器)。

覆盖规则:最后一次打桩会覆盖之前的定义(例如多次对 mock.get(0) 打桩,以最后一次为准)。

3.3 返回值与没有返回值

  • when(...).thenX() 适用于有返回值的方法。

  • doX().when(mock).method() 适用于 void 方法。

3.4 案例

package com.ljf.services;import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;import java.util.List;import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.when;/*** @ClassName: DaZhuangTest* @Description: TODO* @Author: admin* @Date: 2025/08/17 17:47:42 * @Version: V1.0**/
@RunWith(MockitoJUnitRunner.class)
public class DaZhuangTest {@MockList<String> strList;@Testpublic void test(){// 1. 创建模拟对象// 2. 基础打桩:返回固定值when(strList.get(0)).thenReturn("bj");assertEquals("bj", strList.get(0));// 3. 抛出异常when(strList.get(1)).thenThrow(new RuntimeException("索引错误"));assertThrows(RuntimeException.class, () -> strList.get(1));// 4. 多次调用不同返回值when(strList.size()).thenReturn(1)
.thenReturn(2);assertEquals(1, strList.size());assertEquals(2, strList.size());// 5. 参数匹配器(如 anyInt())when(strList.get(anyInt())).thenReturn("default");assertEquals("default", strList.get(999));// 6. Void 方法打桩(如抛出异常)doThrow(new IllegalStateException("清空失败")).when(strList).clear();assertThrows(IllegalStateException.class,strList::clear);}}

未完待续.....

不用Mockito写单元测试?你可能在浪费一半时间

http://www.dtcms.com/a/335775.html

相关文章:

  • 26. Object.defineProperty 和 Proxy 用法
  • 中级统计师-会计学基础知识-第五章 财务报告
  • 计算机算术6-SRT2除法
  • Linux817 shell:until,nfs,random
  • TypeScript中的import语法详解
  • 6.Ansible自动化之-管理变量和事实
  • 关于第一次接触Linux TCP/IP网络相关项目
  • 牛客周赛 Round 105
  • Java -- 坐标体系--绘图方法
  • 《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
  • Originality AI:原创度和AI内容检测工具
  • thingsboard 服务器在2核CPU、2G内存资源配置下如何调优提速,适合开发/演示
  • 飞算JavaAI赋能高吞吐服务器模拟:从0到百万级QPS的“流量洪峰”征服之旅
  • C#读取文件, IO 类属性及使用示例
  • [GLM-4.5] GLM-4.5模型 | Claude Code服务集成
  • Qt 5.5 的安装与配置(使用 VSCode编辑)
  • React 基础实战:从组件到案例全解析
  • Talk2BEV论文速读
  • 什么叫作数据处理?数据处理和数据治理是什么关系
  • Java StringBuffer使用详解
  • Spring MVC 九大组件源码深度剖析(四):HandlerMapping - 请求映射的玄机
  • 电力设备状态监测与健康管理:基于多源异构数据融合的技术实现
  • 【龙泽科技】汽车车身测量与结构件更换仿真教学软件【GEELY+CHIEF】
  • Wasserstein GAN:如何解决GANS训练崩溃,深入浅出数学原理级讲解WGAN与WGAN-GP
  • (机器学习)监督学习 vs 非监督学习
  • 机器学习05-朴素贝叶斯算法
  • Elasticsearch 在向量捜索中使用 Direct I0
  • java-maven
  • 佳文赏读 || (CVPR 2025新突破) Robobrain:机器人操作从抽象到具体的统一大脑模型(A Unified Brain Model)
  • 【教程】笔记本安装FnOS设置合盖息屏不休眠