【JAVA基础篇教学】第十七篇:Java单元测试

博主打算从0-1讲解下java基础教学,今天教学第十七篇:Java单元测试。  

单元测试和集成测试是软件开发过程中至关重要的一部分,它们可以帮助确保代码的质量和稳定性。下面我将为您提供详细说明和代码案例。

一、单元测试(Unit Testing)

单元测试是针对代码中的最小可测试单元进行测试的过程,通常是测试单个方法或类的行为。在 Java 中,通常使用 JUnit 框架进行单元测试。

示例代码:

假设我们有一个简单的 Calculator 类,其中包含 add 方法用于两个数字的加法运算。

public class Calculator {public int add(int a, int b) {return a + b;}
}

下面是对 Calculator 类的 add 方法进行单元测试的示例代码:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;public class CalculatorTest {@Testpublic void testAdd() {Calculator calculator = new Calculator();int result = calculator.add(3, 5);assertEquals(8, result);}
}

在上面的示例中,我们使用了 JUnit 框架的 @Test 注解来标记测试方法,并使用 assertEquals 方法来断言预期的结果与实际结果是否一致。

二、集成测试(Integration Testing)

集成测试是测试不同模块之间的交互是否正常工作的过程,通常涉及多个单元或组件之间的协作。在 Java 中,您可以使用 JUnit 框架结合 Mock 框架(如 Mockito)来进行集成测试。

示例代码:

假设我们有一个 UserService 类,其中包含一个方法 getUserById,该方法根据用户ID从数据库中获取用户信息。

public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(int userId) {return userRepository.findById(userId);}
}public class User {private int id;private String name;// 其他属性和方法
}public interface UserRepository {User findById(int userId);
}

下面是对 UserService 类进行集成测试的示例代码,我们使用 Mockito 框架模拟 UserRepository 接口的实现:

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;public class UserServiceIntegrationTest {@Testpublic void testGetUserById() {// 模拟 UserRepository 的实现UserRepository userRepositoryMock = mock(UserRepository.class);User mockUser = new User(1, "John");when(userRepositoryMock.findById(1)).thenReturn(mockUser);// 创建 UserService 实例,并传入模拟的 UserRepositoryUserService userService = new UserService(userRepositoryMock);// 调用 getUserById 方法并断言结果User result = userService.getUserById(1);assertNotNull(result);assertEquals(1, result.getId());assertEquals("John", result.getName());}
}

在上面的示例中,我们使用了 Mockito 框架来模拟 UserRepository 的实现,并通过传入模拟的 UserRepository 对象来创建 UserService 实例。然后,我们调用 getUserById 方法并断言返回的用户信息是否符合预期。

三、注意事项

  • 单元测试应该是独立的、可重复的,并且不应该依赖外部环境或资源。
  • 集成测试可能涉及到外部依赖,因此要确保测试环境的稳定性和一致性。
  • 使用断言来验证预期结果,确保测试的准确性和可靠性。
  • 遵循良好的测试实践,包括给测试方法取有意义的名称、保持测试代码的简洁和清晰等。

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

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

相关文章

27、Lua 学习笔记之五(Lua中的数学库)

Lua中的数学库 Lua5.1中数学库的所有函数如下表: math.pi 为圆周率常量 3.14159265358979323846 数学库说明例子方法abs取绝对值math.abs(-15)15acos反余弦函数math.acos(0.5)1.04719755asin反正弦函数math.asin(0.5)0.52359877atan2x / y的反正切值math.atan2(9…

JAVA学习-并发.并发的定义

并发是指多个任务在同一时间段内执行。在计算机领域,特指多个线程或进程同时执行的情况。Java提供了多种并发编程的机制,包括线程、锁、信号量、并发集合等。下面将对Java并发编程的一些常见概念、特点以及使用方法进行概述,并与其他比较和高…

Optional类用法

简介 空指针异常是Java应用程序失败的最常见原因。Google公司在著名的Guava项目中引入了Optional类,通过使用检查空值的方式来防止代码污染,来解决臭名昭著的空指针异常问题。受此启发,Optional类已成为Java 8 类库的一部分。 使用 Optional类…

Leetcode 221. 最大正方形

心路历程: 这道题是一个动态规划题,但是其实递推关系很难想到,如下图所示: MDP建模: 状态:以i,j为右下角的正方形 动作候选集:这道题的动作候选集其实是是否选择其左上角邻接的三个位置&#x…

11.范式与反范式设计

范式 1.问题 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多…

linux常用基本命令

# 文本与文本查找 ## 1.grep 常用参数: -A n --after-context显示匹配字符后n行 -B n --before-context显示匹配字符前n行 -C n --context 显示匹配字符前后n行 -c --count 计算符合样式的行数 -i 忽略大小写 -v反转 -a处理二进制文件 -l 只列出文件内容符…

深圳比创达电子EMC|EMC电磁兼容性:电子设备稳定运行的保障

随着科技的飞速发展,电子设备在人们的日常生活中发挥着越来越重要的作用。然而,随之而来的电磁干扰问题也日益突出。电磁兼容性(EMC)作为衡量电子设备在电磁环境中正常工作能力的关键指标,其重要性不言而喻。 一、EMC…

IP地址是随着网络变化的吗?

IP地址,即互联网协议地址,是分配给每个联网设备或网络接口的数字标签。它在网络通信中起着至关重要的作用,是设备之间互相识别和通信的基础。然而,关于IP地址是否随着网络变化,这是一个值得深入探讨的问题,…

每日新闻掌握【2024年4月16日 星期二】

2024年4月16日 星期二 农历三月初八 大公司/大事件 丁雄军:茅台集团2023年出口额超43亿元,占中国白酒出口额的77% 36氪获悉,据贵州茅台微信公众号消息,4月13日,茅台集团党委书记、董事长丁雄军出席全球消费创新系列活…

深度残差收缩网络中,使用 Sigmoid 函数的用意在哪?

在深度残差收缩网络中,使用 Sigmoid 函数将输出归一化到 0 和 1 之间的目的是为了限制输出值的范围,并且使得输出可以被解释为概率。这个 Sigmoid 函数的输出可以被看作是一个置信度或者概率的度量,表示某个事件发生的可能性。 在设置阈值时…

对外观模式的理解

目录 一、场景【[案例来源](https://kamacoder.com/problempage.php?pid1089)】1 题目描述2 输入描述3 输出描述4 输入示例5 输出示例 二、如果不采用外观模式1、实现2、问题 三、采用外观模式1、实现2、优点 四、个人思考 一、场景【案例来源】 1 题目描述 小明家的电源总开…

微信小程序的反编译

参考: 微信小程序的反编译_magic number is not correct!-CSDN博客 如何从在安卓Android手机获取微信小程序源代码 - 知乎 (zhihu.com) 资源: wechar.apk RE管理器.apk Node.js”安装包 反编译GIT:hs610/wxappUnpacker (github.com)

Linux没有显示IP地址,报错mtu 1500 qdisc noop state DOWN group default qlen 1000

问题 复制虚拟机后, 打开,发现没有IP地址. ip addr 1:1o:<LOOPBACK,UP,LOWER_UP>mtu 65536 gdisc noqueue state UNKNOWN group default glen 1000 1ink/1 popback88:80:80:88:88:80brd00:0g:80:80:80:80 inet 127.0.0.1/8 scope host lo valid_lft forever preferre…

详解playwright 官方Javascript demo(适合小白)

如果大家刚上手playwright&#xff0c;并看到了Javascript脚本的官方demo&#xff0c;代码如下&#xff1a; const { webkit } require(playwright);(async () > {const browser await webkit.launch();const page await browser.newPage();await page.goto(http://what…

开放式耳机怎么选?五大市场热卖爆款推荐!

近年来&#xff0c;开放式耳机风潮席卷市场&#xff0c;各大知名品牌纷纷推出新品&#xff0c;以满足消费者的需求。相较于传统的入耳式耳机&#xff0c;开放式耳机凭借其独特的佩戴方式&#xff0c;受到了广大消费者的热烈追捧。它不仅有效避免了长时间佩戴带来的耳道不透气、…

【数据结构】栈的实现

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;前路漫漫亦灿灿 前言 栈是一种特殊的线性表&#xff0c;我们在有了顺序表和链表的知识的基础上&#xff0c;再来学习栈&#xff0c;掌握起来就更轻松了…

所有可能的真二叉树(Lc894)——记忆化搜索

给你一个整数 n &#xff0c;请你找出所有可能含 n 个节点的 真二叉树 &#xff0c;并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val 0 。 答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表。 真二叉树 是一类二叉树&#…

【24年物联网华为杯】赛题分析与初步计划

赛事介绍 官网链接&#xff1a;2024 年全国大学生物联网设计竞赛 (sjtu.edu.cn) 含金量&#xff1a;属于A类赛事 &#xff08;注意&#xff1a;很多搜索结果的序号是按照选入时间排列的&#xff0c;与含金量无关&#xff0c;华为杯是23年选入的&#xff09; Kimi Chat: 全国…

开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过langchain框…

js处理long精度丢失

1、业务背景 调用接口返回数据实体&#xff0c;id是long类型&#xff0c;浏览器(谷歌&#xff09;进行访问返回的id最后两位变成0了&#xff0c;精度丢失。但是通过postman是正常的。 2、问题分析 这是因为在 JavaScript 中&#xff0c;数字类型默认会被转换为双精度浮点数&…