单元测试mock
一、背景
现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。
举例:Ticket类需要调用Flight类和Passenger类,需要测试Ticket类中的saleByAge()方法。我们只需mock 一下Flight类和Passenger类 ,实例化对象 Ticket类,并按照Ticket类的构造方法Ticket()传参。这样我们即使没有Flight类和Passenger类的代码,也可以测试Ticket类的方法。

二、被测试类Ticket.java的代码
package fit5171.monash.edu;
public class Ticket
{private int ticket_id;private int price;Flight flight;private boolean classVip; //indicates if this is bussiness class ticket or notprivate boolean status; //indicates status of ticket: if it is bought by someone or notPassenger passenger;public Ticket(int ticket_id,int price, Flight flight, boolean classVip, Passenger passenger){this.ticket_id=ticket_id;this.price = price;this.flight = flight;this.classVip = classVip;this.status = false;this.passenger=passenger;}public Ticket() {}public int getTicket_id() {return ticket_id;}public void setTicket_id(int ticket_id) {this.ticket_id = ticket_id;}public int getPrice() { return price; }public void setPrice(int price){this.price = price;saleByAge(passenger.getAge()); //changes price of the ticket according to the age category of passengerserviceTax( ); //changes price by adding service tax to the ticket}public void saleByAge(int age){int price = getPrice();if(age < 15){price-=(int)price*0.5;//50% sale for children under 15this.price=price;} else if(age>=60){this.price=0; //100% sale for elder people}}public Flight getFlight() {return flight;}public void setFlight(Flight flight) {this.flight = flight;}public boolean getClassVip() {return classVip;}public void setClassVip(boolean classVip) {this.classVip = classVip;}public boolean ticketStatus(){return status;}public void setTicketStatus(boolean status){this.status = status;}public void serviceTax(){this.price *= 1.12;} //12% service taxpublic Passenger getPassenger() {return passenger;}public void setPassenger(Passenger passenger) {this.passenger = passenger;}public String toString(){return"Ticket{" +'\n'+"Price=" + getPrice() + "KZT, " + '\n' +getFlight() +'\n'+ "Vip status=" + getClassVip() + '\n' +getPassenger()+'\n'+ "Ticket was purchased=" + ticketStatus() + "\n}";}
}
三、测试Ticket类中的SaleByAge方法代码
package fit5171.monash.edu;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;class SaleByAgeTest {private Ticket ticket;private Flight mockFlight;private Passenger mockPassenger;@BeforeEachvoid setUp() {mockFlight=mock(Flight.class);mockPassenger=mock(Passenger.class);ticket=new Ticket(1,100, mockFlight, false, mockPassenger);}@Testvoid testSaleByAgeForChildren() {//儿童半折when(mockPassenger.getAge()).thenReturn(10);ticket.saleByAge(mockPassenger.getAge());//调用方法assertEquals(50,ticket.getPrice());}@Testvoid testSaleByAgeForelder() {//老年人免费when(mockPassenger.getAge()).thenReturn(70);ticket.saleByAge(mockPassenger.getAge());//调用方法assertEquals(0,ticket.getPrice());}
}
四、运行结果如下
五、pom.xml配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>dycs</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- JUnit 5 API --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.10.0</version><scope>test</scope></dependency><!-- JUnit 5 引擎 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.10.0</version><scope>test</scope></dependency><!-- JUnit 平台引擎 --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-engine</artifactId><version>1.10.0</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.8.0</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.9</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.9</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-inline</artifactId><version>5.2.0</version><scope>test</scope></dependency></dependencies></project>
六、注意事项
mock是模拟对象,是空实现。如果要实现具体的业务逻辑的单元测试,必须创建真实对象,真实对象中涉及到类,可以mock。
使用when指定行为的值,如指定mock乘客的年龄为10.
@Testvoid testSaleByAgeForChildren() {//儿童半折when(mockPassenger.getAge()).thenReturn(10);ticket.saleByAge(mockPassenger.getAge());//调用方法assertEquals(50,ticket.getPrice());}
相关文章:
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
OpenGL 将屏幕上的二维坐标转换为三维空间中的一个点
本文主要介绍将屏幕上的二维坐标转换为三维空间中的一个点,该点位于 近 平面上(即 Z 坐标为 -1)。 一、步骤概述 屏幕坐标到标准化设备坐标 (NDC): 将屏幕坐标 (x, y) 转换为 NDC 坐标系。NDC 到相机空间: 使用逆投影矩阵将 NDC 坐标转换到相…...
golang接口用法-代码案例
文章目录 Go语言中接口(interface)的含义接口的常见应用场景示例1示例2(Dog 和 Cat)使用场景-多数据库 Go语言中接口(interface)的含义 接口在Go语言中是一种类型,它定义了一组方法的集合。一个…...
ORA-12162: TNS:net service name is incorrectly specified
1.现象 SQL plus 连接实例报错,已确定实例是open状态。 [rootlocalhost ~]# su - oracle [oraclelocalhost ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Sat Mar 15 10:20:56 2025 Version 19.11.0.0.0Copyright (c) 1982, 2020, Orac…...
基于 Verilog 的时序设计:从理论到实践的深度探索
在数字电路设计领域,时序设计是一个至关重要的环节,它涉及到组合逻辑电路与时序逻辑电路的设计差异、时钟信号的运用以及触发器的工作原理等多个方面。本文将围绕基于 Verilog 的时序设计实验展开,详细阐述实验过程、代码实现以及结果分析,帮助读者深入理解时序设计的核心概…...
GreenKGC: A Lightweight Knowledge Graph Completion Method(论文笔记)
CCF等级:A 发布时间:2023年7月 代码位置 25年3月17日交 目录 一、简介 二、原理 1.整体 2.表示学习 3.特征修剪 4.决策学习 三、实验性能 1.主要结果 2.消融实验 四、结论和未来工作 一、简介 传统知识图谱补全方法中,嵌入维度…...
SSM基础专项复习5——Maven私服搭建(2)
系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架(1)-CSDN博客 3、SSM基础专项复习3——Spring框架(2)-CSDN博客 4、SSM基础专项复习4——Maven项目管理工具(1ÿ…...
Linux中的epoll简单使用案例
I/O 多路复用允许一个进程或线程同时监控多个网络 sockets 的状态。它通过单个系统调用(select)来检查多个 sockets 是否有数据可读、可写或是否有异常。Linux 提供了多种 I/O 复用技术,包括上面提到的 select、以及 poll、epoll。 创建epol…...
ASP4644四通道降压稳压器的工业高效电源管理方案
ASP4644工业级型号(ASP4644I6B)是一款专为工业场景设计的四通道降压稳压器,支持-40C至85C工作温度。其核心特性包括: 宽输入电压范围:4V–14V,适配工业现场多变的电源环境。 高负载能力:单通道…...
kali破解Pdf/execl/word
一、准备工作 1.工具安装 Kali Linux 内置部分工具,需补充安装以下工具: sudo apt update sudo apt install pdfcrack hashcat john -y git clone https://github.com/magnumripper/JohnTheRipper # 更新版John 2.字典准备 常用字典:Kal…...
宇树科技纯技能要求总结
一、嵌入式开发与硬件设计 核心技能 嵌入式开发: 精通C/C,熟悉STM32、ARM开发熟悉Linux BSP开发及驱动框架(SPI/UART/USB/FLASH/Camera/GPS/LCD)掌握主流平台(英伟达、全志、瑞芯微等) 硬件设计:…...
RabbitMq C++客户端的使用
1.RabbitMq介绍 RabbitMQ 是一款开源的消息队列中间件,基于 AMQP(高级消息队列协议)实现,支持多种编程语言和平台。以下是其核心特点和介绍: 核心特点 多语言支持 提供 Java、Python、C#、Go、JavaScript 等语言的客…...
用通义大模型写爬虫程序,汇总各科成绩
需求:根据各科网址,输入学号、姓名查询成绩。 中间反反复复很多次,本文只记下重点的几次和大模型的沟通历史。 输入界面 查询界面 round0(最初的问题) 请在windows下,使用python的selenium库࿰…...
电商项目Ts版本
文章目录 项目地址一、环境安装1.1 配置作为导入1.2 文件目录 二、路由2.1 publicRoutes 项目地址 教程作者:教程地址: 代码仓库地址: 所用到的框架和插件: dbt airflow一、环境安装 1.1 配置作为导入 vite.config.ts impor…...
HarmonyOS Next中的弹出框使用
HarmonyOS Next弹出框概述及分类 弹出框是一种模态窗口,通常用于在保持当前上下文环境的同时,临时展示用户需关注的信息或待处理的操作。用户需在模态弹出框内完成相关交互任务之后,才能退出模态模式。弹出框可以不与任何组件绑定࿰…...
C++实现的数据结构示例,涵盖链表、数组、树和图
使用C实现的数据结构示例,涵盖链表、数组、树和图的基本操作: 链表(单向链表) #include <iostream> using namespace std;struct Node {int data;Node* next;Node(int val) : data(val), next(nullptr) {} };class Linked…...
FPGA中级项目4——DDS实现
FPGA中级项目4——DDS实现 DDS简介 DDS(直接数字频率合成器,Direct Digital Frequency Synthesis)是一种基于数字信号处理技术的频率合成方法,广泛应用于通信、雷达、仪器仪表等领域。在 FPGA中实现 DDS 具有灵活性高、集成度强、…...
深度学习-149-langchain之如何不使用with_structured_output()从模型中返回结构化数据
文章目录 1 不使用with_structured_output()方法1.1 问题背景1.2 输出解析器1.3 远程deepseek大模型API2 基于提示词2.1 直接使用提示词2.2 少样本提示词3 直接提示和解析模型输出3.1 使用PydanticOutputParser3.1.1 构建解析器3.1.2 构建提示模板3.1.3 调用大模型3.1.4 调用链…...
STM32 DAC详解:从原理到实战输出正弦波
目录 一、DAC基础原理1.1 DAC的作用与特性1.2 DAC功能框图解析 二、DAC配置步骤2.1 硬件配置2.2 初始化结构体详解 三、DAC数据输出与波形生成3.1 数据格式与电压计算3.2 正弦波生成实战3.2.1 生成正弦波数组3.2.2 配置DMA传输3.2.3 定时器触发配置 四、常见问题与优化建议4.1 …...
深度学习框架PyTorch——从入门到精通(5)构建神经网络
构建神经网络 获取训练设备定义类模型层nn.Flattennn.Linearnn.ReLUnn.Sequentialnn.Softmax 模型参数补充说明argmax 神经网络是由一些层或者模块组成的,这些层和模块会对数据进行各种操作。 在 PyTorch 里,torch.nn 这个命名空间提供了你搭建自己神经网…...
基于PyQt5与Open3D的轻量化BIM工具开发指南(下)
基于PyQt5与Open3D的轻量化BIM工具开发指南(下) ——参数化建模、数据导出与性能优化 【跳转】基于PyQt5与Open3D的轻量化BIM工具开发指南(上) 四、详细实现步骤(Part 2) 3. 参数化建模…...
Pytest项目_day01(HTTP接口)
HTTP HTTP是一个协议(服务器传输超文本到浏览器的传送协议),是基于TCP/IP通信协议来传输数据(HTML文件,图片文件,查询结果等)。 访问域名 例如www.baidu.com就是百度的域名,我们想…...
在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态
目录 前言 一.问题描述 二.后端实现 1.分析 2.检查后端拦截器,看看是否允许接收Patch类型的请求 3.编写Dto 4.编写controller层 5.编写service层 6.mapper层 7.使用apifox,测试后端接口的可用性 三.前端实现 1.封装api(本质是ax…...
Android Zygote的进程机制
目录 ✅ Android Zygote 进程机制详解 🚩 一、Zygote 的作用 ⚙️ 二、Zygote 启动流程 ✅ 1. init 进程启动 Zygote ✅ 2. Zygote 初始化虚拟机与核心类库 ✅ 3. Zygote 监听 Socket ✅ 4. Zygote fork 创建应用进程 🔥 三、Zygote 与应用进程之…...
某快餐店用户市场数据挖掘与可视化
1、必要库的载入 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns2、加载并清洗数据 # 2.1 加载数据 df pd.read_csv(/home/mw/input/survey6263/mcdonalds.csv)# 2.2 数据清洗 # 2.2.1 检查缺失值 print(缺失值情况:) print(df.isn…...
[C++面试] 标准容器面试点
一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组,它将元素存储在连续的内存空间中。支持随机访问,即可以通过下标快速访问任意位置的元素,时间复杂度为 O(1),准确点是均摊O(1)。但在中间或开头插…...
单片机学完开发板,如何继续提升自己的技能?
很多人学完开发板后都会卡在一个尴尬的阶段:觉得自己会的东西不少,但又不知道下一步该干啥。会点C语言,能烧录程序,能点亮LED,玩转按键,搞定串口等等,能用开发板做点小玩意儿,但面对…...
luogu「EZEC-10」打分 --- Python3 解法
题目链接: 「EZEC-10」打分 import sysdef max_score(n, m, scores):scores.remove(min(scores)) # 最小值的选取,不影响中间部分的处理scores.sort()max_ scores[-1]sum_ sum(scores[:-1]) # 中间部分len_ len(scores)needed (len_ - 1) * max_ …...
MySQL事务介绍
一、一个典型的事务场景 步骤操作描述SQL 语句1开启事务,确保转账操作的原子性START TRANSACTION;2从用户 A 的账户中扣除 100 元UPDATE account SET balance balance - 100 WHERE user A;3向用户 B 的账户中添加 100 元UPDATE account SET balance balance 1…...
明基PD2700U显示器无法调节图像模式
现象:明基PD2700U显示器无法调节图像模式,如下图: 目前未找到根本原因,推测可能是下面的原因: 1、安装了远程桌面软件:向日葵、虚拟显示器 2、显卡插入了接口,但是没接显示器 解决办法…...
