当前位置: 首页 > 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.lryc.cn/news/623763.html

相关文章:

  • 魔改chromium源码——解除 iframe 的同源策略
  • 《Nursing Research》(护理SCI)LaTeX模板详细教程:从入门到投稿(一)
  • 深度解析 Spring Bean 生命周期
  • Microsoft WebView2
  • SQL详细语法教程(四)约束和多表查询
  • 网络常识-我的电脑啥时安装了证书
  • 【力扣热题100】双指针—— 接雨水
  • 【AI智能体】Dify 搭建发票识别助手操作实战详解
  • 微信小程序 小白gps工具v0.01 使用说明
  • XF 306-2025 阻燃耐火电线电缆检测
  • QUIC浅析
  • C++ 标准模板库 (^^ゞ 致敬 STL 创始人 Alexander Stepanov
  • 笔记本电脑wifi小图标不见了 或者 蓝牙功能消失、电脑开不开机解决方法
  • 基于飞算JavaAI的可视化数据分析集成系统项目实践:从需求到落地的全流程解析
  • Shell脚本-while循环语法结构
  • ACPI TABLE 方式加载device driver--以spi controller为例
  • 字节 Golang 大模型应用开发框架 Eino简介
  • Pulsar存储计算分离架构设计之存储层BookKeeper(上)
  • 在线编程题目之小试牛刀
  • C#高级语法_委托
  • Windows平台Frida逆向分析环境完整搭建指南
  • 从需求到部署全套方案:餐饮服务许可证数据可视化分析系统的大数据技术实战
  • 发票识别工具,合并PDF提取信息
  • JavaScript字符串详解
  • 001.Redis 简介及安装
  • 【杂谈】-以质代量:谷歌主动学习范式重构AI训练逻辑
  • Mac(四)自定义按键工具 Hammerspoon 的安装和使用
  • vue封装请求拦截器 响应拦截器
  • SCAI采用公平发射机制成功登陆LetsBonk,60%代币供应量已锁仓
  • 智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“