[AIGC] “从入门到实践:使用Mockito优雅地处理Java单元测试“

当需要测试的接口依赖多个其他的接口时,我们依旧可以使用Mockito来进行处理。这时候,我们通常会使用到Mockito的@InjectMocks@Mock注解。

下面提供一个例子,这个例子描述了一个BookService类,它依赖于另外两个接口:BookRepository和UserRepository:

public class BookService {private final BookRepository bookRepository;private final UserRepository userRepository;public BookService(BookRepository bookRepository, UserRepository userRepository) {this.bookRepository = bookRepository;this.userRepository = userRepository;}public Book lendBook(int bookId, int userId) {Optional<User> user = userRepository.findById(userId);Optional<Book> book = bookRepository.findById(bookId);if (book.isPresent() && user.isPresent()) {book.get().setUser(user.get());return bookRepository.save(book.get());}throw new RuntimeException("Book or User not found");}
}

在测试该BookService类时,我们需要mock掉BookRepository和UserRepository接口,并模拟它们的行为:

@RunWith(MockitoJUnitRunner.class)
public class BookServiceTest {@InjectMocksprivate BookService bookService;@Mockprivate BookRepository bookRepository;@Mockprivate UserRepository userRepository;@Testpublic void testLendBook() {User user = new User(1, "John");Book book = new Book(1, "A Tale of Two Cities", null);when(userRepository.findById(1)).thenReturn(Optional.of(user));when(bookRepository.findById(1)).thenReturn(Optional.of(book));when(bookRepository.save(book)).thenReturn(book);Book result = bookService.lendBook(1, 1);assertEquals(user, result.getUser());}
}

在上面的测试案例中,@InjectMocks注解被用于创建BookService的实例,同时将由@Mock注解创建的mock对象自动注入到BookService实例中。针对UserRepository和BookRepository的模拟行为被定义在when函数调用中。

这样我们就可以在没有真实数据库环境的情况下,通过模拟预期行为来对BookService进行单元测试了。

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

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

相关文章

C++ 反转单词

在C中&#xff0c;反转一个字符串中的单词&#xff08;单词之间通过空格分隔&#xff0c;但单词内部保持原有顺序&#xff09;可以通过以下步骤实现&#xff1a; 找到字符串中的所有单词&#xff0c;这可以通过查找空格来实现。将单词存储在一个容器中&#xff08;例如 std::v…

代码随想录——删除二叉搜索树中的节点(Leetcode450)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

4-护网需要具备的技能

红队&#xff1a; 外围打点能力漏洞挖掘能力漏洞分析能力权限提升能力权限维持能力钓鱼远控能力代码审计能力木马免杀能力内网渗透能力横向移动能力域渗透能力跨域渗透能力 蓝队&#xff1a; 设备使用能力设备监控能力研判分析能力攻击辨别能力流量分析能力入侵排查能力日志…

RapidJSON

要在项目中使用 RapidJSON 库&#xff0c;需要首先下载并包含该库的头文件。以下是详细的步骤&#xff0c;包括如何下载、引用和使用 RapidJSON&#xff1a; 使用 CMake 引用 RapidJSON 如果你的项目使用 CMake 构建系统&#xff0c;可以按照以下步骤引用 RapidJSON&#xff…

终极GPU互联技术探索:消失的内存墙

一、引言 随着人工智能、大数据、云计算等技术的飞速发展&#xff0c;计算能力的需求呈现出爆炸性增长。在这个背景下&#xff0c;图形处理器&#xff08;GPU&#xff09;凭借其强大的并行计算能力&#xff0c;在深度学习、科学计算等领域扮演着越来越重要的角色。然而&#x…

用Pip配置Pytorch环境 (Pytorch==2.3.0)

用Pip配置Pytorch环境 (Pytorch2.3.0) 本文主要讲解: 如何用Conda搭建Pytorch环境&#xff0c;用Conda的方式安装&#xff0c;需要单独去安装Cuda。 1. 下载Python安装包 安装Python 3.10.11&#xff0c;下载地址 Python 3.10.11 2. CUDA 安装 安装CUDA 12.1&#xff0c; …

JavaSE—泛型

1 泛型定义和基本使用 泛型是JDK1.5以后才有的&#xff0c; 可以在编译时期进行类型检查&#xff0c;且可以避免频繁类型转化&#xff01; Test public void test1() {List list new ArrayList();list.add("ZhangSan");list.add(1);//集合使用 取出元素Object obj…

R语言数据探索和分析22-使用随机森林和聚类算法探索和预测健康状况

一、研究背景 在两个实验中&#xff0c;使用了一组综合性的生物统计数据来探索和预测健康状况&#xff08;特别是疾病的发生&#xff09;。实验的核心在于应用高级数据分析技术&#xff0c;具体包括随机森林分类和聚类分析&#xff0c;来洞察和预测个体的健康状况。首先&#…

【十大排序算法】选择排序

选择就像是在谱曲&#xff0c;每个决定就是一个音符&#xff0c;只有将它们有序地安排在一起&#xff0c;才能奏响美妙的乐章。 文章目录 一、选择排序的思想二、选择排序的发展历程三、选择排序具象化四、选择排序算法实现五、选择排序的特性推荐阅读 一、选择排序的思想 选…

Kafka初步学习

kafka消息队列模式 点对点模式&#xff1a;一对一&#xff0c;消费者主动拉取数据&#xff0c;消息收到后消息清除 消息生产者生产消息发送到queue中&#xff0c;然后消息消费者从queue中取出并且消费消息 消息被消费以后&#xff0c;queue中不再有存储&#xff0c;所以消息消费…

【DevOps】网站安全事件分析方法详解和实战分析

目录 一、网站安全事件分析流程 二、常用的网站安全事件分析方法 三、网站被植入挖矿脚本事件分析 1、 事件发现与确认 2、 事件隔离与取证 3、 事件分析与溯源 4、 事件处置与恢复 5、 事件总结与改进 四、网站安全事件分析的关键点 五、提高网站安全事件分析能力的…

python使用appium截图手机屏幕图片

要使用 Appium 截取手机屏幕图片并在电脑上显示&#xff0c;你需要执行几个步骤。以下是一个基本的流程&#xff1a; 设置 Appium 环境&#xff1a;确保你已经安装了 Appium 服务器和 Python 客户端库&#xff08;如 appium-python-client&#xff09;。编写 Python 脚本&…

详解大厂实时数仓建设V4.0

一、实时数仓建设背景 1. 实时需求日趋迫切 目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切&#xff0c;需要实时数仓的能力来赋能。传统离线数仓的数据时效性是 T1&#xff0c;调度频率以天为单位&#xff0c;无法支撑实时场景的数据需求。即使能将调度频…

参数传递和剪枝,从修剪二叉树谈起

669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、参数传递 Java中的参数传递方式只有一种&#xff0c;那就是值传递。如果我们传的是基本数据类型&#xff0c;那么函数接收到的就是该数据的副本&#xff0c;如果我们传的是对象&#xff0c;那么函数接收到的就…

Uniapp与第三方应用数据通讯

首先说明一点&#xff0c;这个只是uniapp代码编写的应用之间相互传递数据&#xff0c;uniapp编写的与其他语言编写的我尚不知道能不能传递。 应用1&#xff1a; plus.runtime.launchApplication({pname: "应用的appid",// extra 中可以自定数据&#xff0c;url和da…

【Qt知识】部分QWidget属性表格

QWidget是Qt库中所有图形用户界面组件的基类&#xff0c;它提供了大量属性以供自定义和配置控件的行为和外观。下面列出了一些主要的QWidget属性及其作用。 属性 作用 accessibleName 控件的辅助技术名称&#xff0c;用于无障碍访问。 accessibleDescription 控件的辅助技…

详解MySQL的间隙锁

MySQL 的间隙锁&#xff08;Gap Lock&#xff09; 间隙锁&#xff08;Gap Lock&#xff09;是 InnoDB 存储引擎中的一种锁机制&#xff0c;用于防止幻读现象。幻读是指在一个事务中&#xff0c;两次读取同一个范围的数据时&#xff0c;第二次读取出现了第一次没有出现的数据行…

CSS真题合集(一)

CSS真题合集&#xff08;一&#xff09; 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题&#xff08;垂直塌陷&#xff09; 3. 响应式布局3.1…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

spring aop小记

一、aop概念 面向切面编程 参考&#xff1a;https://blog.csdn.net/lhj520cb/article/details/125820513 常用术语解释&#xff08;根据代码理解的&#xff09;&#xff1a; Aspect(切面)&#xff1a;Advice 通知(即增强)和 Pointcut 切点的结合。&#xff08;数学上可以理…