Mokito的一些API

Mockito是一个Java单元测试框架,它允许开发者创建和配置模拟对象(mock objects),以便在隔离的环境中测试代码,尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。

基础API

  1. 创建Mock对象

    • @Mock 注解或 Mockito.mock(Class<T> classToMock) 方法用于创建mock对象。

    场景: 当你需要模拟一个类的行为,以便测试依赖于它的类或方法时。

    示例:

    @Mock
    List<String> mockedList;// 或者
    List<String> mockedList = Mockito.mock(List.class);
    
  2. 定义Mock行为

    • Mockito.when(mockedMethodCall).thenReturn(value) 定义当特定方法被调用时应返回的值。

    场景: 你想要控制模拟对象在特定调用下的响应。

    示例:

    Mockito.when(mockedList.get(0)).thenReturn("first");
    
  3. 验证交互

    • Mockito.verify(mockedObject).methodCall(arguments) 验证某个方法是否按照预期被调用了。

    场景: 验证测试过程中mock对象的某个方法确实被正确调用。

    示例:

    mockedList.add("one");
    Mockito.verify(mockedList).add("one");
    
  4. 捕获参数

    • 使用 ArgumentCaptor 捕获传递给mock方法的参数,以便进一步检查。

    场景: 需要检查方法调用的具体参数时。

    示例:

    ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
    Mockito.verify(mockedList).add(argument.capture());
    assertEquals("captured", argument.getValue());
    
  5. 设置异常

    • Mockito.when(mockedMethodCall).thenThrow(exception) 用于模拟方法抛出异常。

    场景: 测试代码对异常的处理逻辑。

    示例:

    Mockito.when(mockedList.get(999)).thenThrow(new IndexOutOfBoundsException());
    

具体使用场景示例

假设你有一个UserService类,它依赖于UserRepository来获取用户信息。你想测试UserServicegetUserById方法,但不希望真实地查询数据库。

public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(int id) {return userRepository.findById(id);}
}public interface UserRepository {User findById(int id);
}

测试类使用Mockito模拟UserRepository

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;class UserServiceTest {@MockUserRepository userRepository;private UserService userService;@BeforeEachvoid setUp() {userService = new UserService(userRepository);}@Testvoid getUserById_ReturnsUser() {// 创建模拟行为User mockUser = new User(1, "John Doe");when(userRepository.findById(1)).thenReturn(mockUser);// 调用待测试方法User result = userService.getUserById(1);// 验证结果assertEquals(mockUser, result);// 验证交互Mockito.verify(userRepository).findById(1);}
}

在这个例子中,UserRepository被模拟,其findById方法被设定为返回一个预设的User对象,从而允许我们专注于测试UserService的逻辑,而不必关心数据库操作的细节。

当然,除了基本的Mock对象之外,Mockito还提供了Spy功能,以及其他一些高级特性,以满足更复杂的测试需求。下面我将继续介绍这些内容。

Spy

Spy与Mock相似,但它会委托真实对象执行未被模拟的方法调用,只有被明确指定的方法才会被模拟。这在你需要大部分保留原有对象行为,仅修改或监控部分行为时非常有用。

API:

  • Mockito.spy(Object object) 创建一个Spy对象。

场景: 当你希望大部分情况下使用真实对象的行为,只在某些特定方法上进行模拟或验证时。

示例:

public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}@Test
void testSpy() {Calculator realCalculator = new Calculator();Calculator spyCalculator = Mockito.spy(realCalculator);// 模拟add方法的行为when(spyCalculator.add(1, 1)).thenReturn(3);// 调用真实subtract方法int result = spyCalculator.subtract(5, 2);// 验证add方法的模拟行为assertEquals(3, spyCalculator.add(1, 1));// 验证subtract方法的调用及结果assertEquals(3, result);verify(spyCalculator).subtract(5, 2);
}

其他高级API

  1. DoAnswer: 提供更灵活的方式来定义模拟方法的行为,可以基于回调函数执行自定义逻辑。

    示例:

    doAnswer(invocation -> {Object[] args = invocation.getArguments();return args[0] + args[1];
    }).when(someMock).someMethod(anyInt(), anyInt());
    
  2. BDD风格: Mockito提供了一套行为驱动开发(Behavior-Driven Development)风格的API,使得测试代码更加可读。

    示例:

    given(mockedList.get(0)).willReturn("first");
    then(mockedList).should().add("one");
    
  3. MockitoJUnitRunner: 使用这个Runner可以自动初始化使用@Mock@Spy注解的字段,无需在每个测试方法中手动初始化。

    示例:

    @RunWith(MockitoJUnitRunner.class)
    public class MyTestClass {@MockList<String> mockedList;// 测试方法...
    }
    
  4. MockitoAnnotations.openMocks(this): 如果不使用MockitoJUnitRunner,可以在测试类的setUp方法中手动打开Mockito注解。

    示例:

    @BeforeEach
    public void setUp() {MockitoAnnotations.openMocks(this);
    }
    

通过结合使用这些API,Mockito能够帮助开发者编写更加高效、精确的单元测试,确保代码质量。

使用说明

具体使用说明和示例,你可以参考以下资源:

  • 官方文档: 访问Mockito官方网站,查看最新的官方文档,包括API参考和用户指南。
  • 在线教程: 网站如Stack Overflow上有大量关于Mockito使用的问答,涵盖了从基础到高级的各个方面。
  • 技术博客: CSDN、博客园等技术社区有大量Mockito的教程和实践分享,比如通过搜索“Mockito进阶使用”、“Mockito详尽教程”等关键词。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网

WordPress&#xff0c;作为一款强大且灵活的开源内容管理系统&#xff0c;已成为许多网站开发者与运营者的首选。其强大的功能、丰富的插件以及易于上手的特点&#xff0c;使得无论是初学者还是专业开发者都能轻松构建出个性化的网站。然而&#xff0c;对于初学者来说&#xff…

JUnit5标记测试用例

使用场景&#xff1a; 通过Tag对用例分组&#xff1a; 环境分组&#xff1a;测试环境、预发布环境阶段分组&#xff1a;冒烟用例版本分组&#xff1a;V1.1、V1.2 Tag标记用例&#xff1a; 设置标签根据标签执行 结合Maven执行结合测试套件执行 设置标签&#xff1a; 通过T…

NER 数据集格式转换

NER 数据集格式 格式一 某些地方的数据和标签拆成两个文件了 sentences.txt 如 何 解 决 足 球 界 长 期 存 在 的 诸 多 矛 盾 &#xff0c; 重 振 昔 日 津 门 足 球 的 雄 风 &#xff0c; 成 为 天 津 足 坛 上 下 内 外 到 处 议 论 的 话 题 。 该 县 一 手 抓 农 业…

【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式

文章目录 推送模式本地文件持久化&#xff08;拉模式&#xff09;配置yml编写处理类添加配置演示 配置中心持久化&#xff08;推模式&#xff09;修改nacos在sentinel中生效引入依赖配置文件 修改sentinel在nacos中生效下载源码更改代码演示 总结 推送模式 Sentinel 规则的推送…

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后&#xff0c;再生成网表&#xff0c;导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中&#xff0c; 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日&#xff0c;2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题&#xff0c;以大模型应用为核心、以 AI 落地为导向&#xff0c;展示了火山引擎在大模型、云计算领域的实践应用&#xff0c;携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…

2024042102-array-list

数组 Array 一、前言 数组是数据结构还是数据类型&#xff1f; 数组只是个名称&#xff0c;它可以描述一组操作&#xff0c;也可以命名这组操作。数组的数据操作&#xff0c;是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数据&#xff0c;而…

js积累三(web页面一段时间未操作,退出登录)

//核心代码&#xff0c;已封装function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds&#xff0c;可自行修改时长var time_time maxTime;/* 鼠标点击事件 */$(document).mousedown(function(){time_time maxTime; //…

Spring Aop对本地事务的影响

1.Transactional声明式事物也是基于aop实现的&#xff0c;public方法加了Transactional注解后&#xff0c;已经成功的创建了事务&#xff0c;但是当前方法仍在方法拦截器中 2.业务方法发生异常之后的处理 判断回滚条件&#xff1a; 如果自定义了RollbackRuleAttribute列表&am…

EI会议的最佳论文奖是什么?如何申请?

EI会议的最佳论文奖通常是指在EI&#xff08;工程索引&#xff0c;Engineering Index&#xff09;收录的学术会议中&#xff0c;评选出的表现最优秀的论文奖项。以下是关于该奖项的一些基本信息及申请步骤&#xff1a; 最佳论文奖的含义 评选标准&#xff1a;最佳论文奖通常基…

多线程、进程、线程五种状态、synchronized、volatile、Lock、CAS、死锁、ThreadLocal

1、并发编程 并发编程三要素 原子性&#xff1a;只一个操作要么全部成功&#xff0c;要么全部失败可见性&#xff1a;一个线程对共享变量的修改&#xff0c;其他线程能够立刻看到有序性&#xff1a;程序执行的顺序按照代码的先后顺序执行 synchronized&#xff0c;Lock解决原…

前端vue 动态加载ts文件,动态调用ts内的方法

业务场景: 在某个业务场景中, 我们需要在数据库配置ts文件路径,和需要调用的函数名称, 前端需要再指定的场景下,触发对应的函数, 并执行处理逻辑,返回结果. 实现: 这是一个数据库配置生成的动态表单 动态校验的例子, 需要引用动态的函数校验 任意一个js文件, common1.ts c…

大模型日报|今日必读的 13 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.MIT新研究&#xff1a;并非所有语言模型特征都是线性的 最近的研究提出了线性表征假说&#xff1a;语言模型通过操作激活空间中概念&#xff08;“特征”&#xff09;的一维表征来执行计算。与此相反&#xff0c;来…

CHI dataless 传输——CHI(4)

上篇介绍了read的操作类型&#xff0c;本篇我们来介绍一下dataless 目录 一、dataless操作概览 二、Non-CMO (Non-Cache Maintenance Operation) 1、CleanUnique 2、StashOnce and StashOnceSep 3、Evict 三、CMO (Cache Maintenance Operation) 一、dataless操作概览 名…

C# 中的 Dictionary<TKey, TValue> 类

Dictionary<TKey, TValue> 是 C# 中的一个泛型集合类,它提供了一种键值对的存储结构,可以用来存储和快速访问数据。它的主要特点如下: 键值对结构: Dictionary 中的每个元素都是一个键值对,键必须是唯一的,值可以重复。 快速访问: Dictionary 基于哈希表实现,可以提供 O…

大白话聊聊MySQL查询之五子句(知识简单但重要)

前言&#xff1a; 在日常开发中&#xff0c;查询数据占很大的比重&#xff0c;在使用 MySQL 数据库进行查询时&#xff0c;我们经常需要通过各种条件和规则来筛选和排序数据。要实现这些功能&#xff0c;就不得不使用以下这些子句&#xff1a;WHERE、ORDER BY、GROUP BY、HAVI…

物联网层次架构设计

物联网可以分为三个层次&#xff0c;底层是用来感知数据的感知层&#xff0c;即利用传感器、二维码、RFID等设备随时随地获取物体的信息。第二层是数据传输处理的网络层&#xff0c;即通过各种传感网络与互联网的融合&#xff0c;将对象当前的信息实时准确地传递出去。第三层则…

忍の摸头之术游戏娱乐源码

本资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; 忍の摸头之术游戏娱乐源码&#xff0c;抖音上面非常火的摸头杀画面,看得我眼花缭乱,源码拿去玩吧&#xff1b; 目录说明 忍の摸头之术&#xff1a;域…

轻松同步:将照片从三星手机传输到iPad的简便方法

概括 想要在新 iPad 上查看三星照片吗&#xff1f;但是&#xff0c;如果您不知道如何将照片从三星手机传输到 iPad&#xff0c;则无法在 iPad 上查看图片。为此&#xff0c;本文分享了 7 个有用的方法&#xff0c;以便您可以使用它们在不同操作系统之间轻松发送照片。现在&…

EfficientSAM分割对象后求其中图像中的高

1 分割对象 EfficientSAM https://github.com/yformer/EfficientSAM 2 计算在图像中最高点即y值最小点 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…