第十站:Java白——测试与调试的艺术

JUnit作为单元测试的首选工具,帮助开发者确保每个模块按预期工作。Mockito等模拟框架则使得复杂系统中的隔离测试成为可能。而集成开发环境(IDE)如IntelliJ IDEA,凭借其强大的代码分析、调试和重构功能,成为Java开发者手中的神兵利器,提升开发效率和代码质量。

当然,为了呼应我们的旅程,让我们通过一个简短的Java代码示例来展示JUnit测试和Mockito模拟的使用,以及如何在IntelliJ IDEA中进行调试。这个例子会涉及一个简单的服务类,它有一个依赖外部服务的方法,我们将对此进行单元测试并使用Mockito来模拟这个外部依赖。

服务类 MyService.java

public class MyService {private ExternalService externalService;public MyService(ExternalService externalService) {this.externalService = externalService;}// 返回外部服务提供的数据加上处理public String processData(String input) {String externalData = externalService.fetchData();return input + " processed with " + externalData;}
}

外部服务接口及模拟实现 ExternalService.java

public interface ExternalService {String fetchData();
}// Mockito会模拟这个类的行为
class RealExternalService implements ExternalService {@Overridepublic String fetchData() {// 假设这是实际的网络请求return "Real Data from External Service";}
}

JUnit测试类 MyServiceTest.java

在这里,我们使用JUnit进行测试,并利用Mockito来模拟ExternalService的行为,以便我们可以完全控制测试环境。

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;public class MyServiceTest {private MyService myService;private ExternalService mockExternalService;@BeforeEachpublic void setUp() {// 创建Mock对象mockExternalService = Mockito.mock(ExternalService.class);// 当fetchData被调用时,返回预设值when(mockExternalService.fetchData()).thenReturn("Mocked Data");// 使用Mock对象初始化MyServicemyService = new MyService(mockExternalService);}@Testpublic void testDataProcessing() {// 测试processData方法String result = myService.processData("Test Input");assertEquals("Test Input processed with Mocked Data", result);}
}

在IntelliJ IDEA中进行调试

  1. 运行测试:在MyServiceTest.java中,右击testDataProcessing方法,选择"Run ‘testDataProcessing()’"来执行测试。
  2. 设置断点:在想要暂停执行的代码行(比如String result = myService.processData("Test Input");)点击行号旁的空白区域设置断点。
  3. 启动调试:再次右击测试方法,这次选择"Debug ‘testDataProcessing()’"。程序会在断点处停止,允许你逐步执行、查看变量值、评估表达式等。
  4. 使用调试工具栏:利用IntelliJ IDEA的调试工具栏(位于底部),你可以逐过程(Step Over)、步入(Step Into)、步出(Step Out)以及继续执行(Resume Program)等操作。

这样,你就完成了从编写JUnit测试、使用Mockito模拟到在IntelliJ IDEA中进行调试的整个流程,这正是Java测试与调试艺术的体现。

当然,为了进一步深入,让我们例举了一个更具体且实用的例子,来展示如何在实际项目中运用JUnit和Mockito进行复杂的测试场景。这次,我们将设计一个简化的用户服务类,该类负责从数据库中获取用户信息,并对其进行一些业务逻辑处理。我们将利用Mockito来模拟数据库访问层,避免真实数据库交互,从而专注于服务逻辑的测试。

用户服务类 UserService.java

public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 根据ID获取用户,并检查用户状态是否活跃public User getUserAndCheckStatus(int userId) throws Exception {User user = userRepository.findById(userId);if (user == null) {throw new Exception("User not found.");}if (!user.isActive()) {throw new Exception("User is inactive.");}return user;}
}

用户存储库接口及模拟实现 UserRepository.java

public interface UserRepository {User findById(int id);
}class RealUserRepository implements UserRepository {// 实现从数据库查找用户的方法// ...
}class MockUserRepository implements UserRepository {// 这里可以为测试定制数据返回// ...
}

JUnit测试类 UserServiceTest.java

在这个测试类中,我们将使用Mockito来模拟UserRepository,以便我们可以完全控制findById方法的返回值,进而测试不同场景下的getUserAndCheckStatus方法行为。

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.when;@ExtendWith(MockitoExtension.class)
public class UserServiceTest {@Mockprivate UserRepository userRepository;@InjectMocksprivate UserService userService;@BeforeEachpublic void setUp() {// 准备测试数据}@Testpublic void testGetUserWhenFoundAndActive() {User mockUser = new User(1, "Alice", true); // 假设User类有相应的构造器和字段when(userRepository.findById(1)).thenReturn(mockUser);User user = userService.getUserAndCheckStatus(1);assertEquals("Alice", user.getName());}@Testpublic void testGetUserWhenNotFound() {when(userRepository.findById(2)).thenReturn(null);Exception exception = assertThrows(Exception.class, () -> userService.getUserAndCheckStatus(2));assertEquals("User not found.", exception.getMessage());}@Testpublic void testGetUserWhenInactive() {User mockUser = new User(3, "Bob", false);when(userRepository.findById(3)).thenReturn(mockUser);Exception exception = assertThrows(Exception.class, () -> userService.getUserAndCheckStatus(3));assertEquals("User is inactive.", exception.getMessage());}
}

在这个例子中,我们不仅展示了如何使用JUnit定义测试用例,还展示了如何利用Mockito来模拟依赖,使测试更加聚焦和高效。这种做法在复杂的系统中尤为重要,因为它允许我们独立地验证各个组件的功能,而不需要依赖真实的外部服务或数据,从而确保了测试的可靠性和速度。

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

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

相关文章

经典游戏案例:仿植物大战僵尸

学习目标:仿植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum…

Web APIs-DOM-事件相关整理(完成网页交互)

目录 1.事件监听 2.事件监听绑定 3.事件类型 4.实例注意 5.事件对象 6.环境对象 7.回调函数 1.事件监听 (绑定事件/注册事件): 程序检测有没有事件产生(事件:比如单机一个按钮(编程时系统发生的动作或者事情&a…

网络爬虫Xpath开发工具的使用

开发人员在编写网络爬虫程序时若遇到解析网页数据的问题,则需要花费大量的时间编 写与测试路径表达式,以确认是否可以解析出所需要的数据。为帮助开发人员在网页上直接 测试路径表达式是否正确,我们在这里推荐一款比较好用的 XPath 开发工…

深入探索YARN集群:NodeManager内存配置与管理全攻略

深入探索YARN集群:NodeManager内存配置与管理全攻略 引言 Apache Hadoop YARN(Yet Another Resource Negotiator)作为Hadoop生态系统中的一个关键组件,为集群资源管理和作业调度提供了强大的支持。在YARN集群中,Node…

轻松学AI绘画:PS AI插件,小白的入门秘籍

各位AIGC创意爱好者们,你们是否对AI绘画充满好奇,却又对那些复杂的国外软件感到望而却步?别急,今天我要为大家介绍一款适合新手的国产PS AI插件——StartAI,它将为你的创作之路带来无限可能! StartAI&…

大学网页制作作品1

作品须知:1.该网页作品预计分为5个页面(其中1个登录页面,1个首页主页面,3个分页面),如需要可自行删改增加页面。(总共约800行html,1200行css,100行js) 2.此网页源代码只用于学习和模…

短视频最火的10个拍摄技巧,新手也能这样拍出大片效果

短视频越来越占据了人们的生活,不管是记录生活还是发个朋友圈是不是总感觉咱们自己拍出来的效果总是不如别人呢?更别说发短视频平台呢!下面就分享10个拍摄技巧大家学着试试慢慢也能拍出大片效果。 不管你以后是否发展短视频平台,…

docker配置使用

Docker配置与使用指南 目录: 简介 安装Docker 基本命令 镜像管理 容器管理 数据卷管理 网络管理 Dockerfile编写 示例代码 简介 Docker是一个开源的应用容器引擎,可以让开发者将应用及其依赖包打包到一个轻量级的、可移植的容器中,…

免费的音频剪辑软件有哪些?分享9个实用的软件,自媒体人必备!

音频剪辑软件能够帮助我们对音视频文件实现个性化剪辑,包括分割、合并、添加音效、转换格式等。那么都有哪些免费好用的音频剪辑软件和方法,本文整理了电脑、手机、在线的音频剪辑方法,能够有效解决音频剪辑的需求,一起来看看吧&a…

本地电脑配置不足,对工业仿真计算有哪些影响?

工业仿真计算对电脑的要求相对较高,这主要是因为仿真过程涉及到大量的数据处理和复杂的计算任务。一个高效的工业仿真系统需要强大的计算能力和稳定的运行环境,以确保仿真的准确性和实时性。 工业仿真对电脑配置有哪些要求 首先,工业仿真计算…

mysql函数之lpad和rpad用于字符串填充

《LPAD》 定义用法 在mysql中,lpad是一个字符串函数,用于在字符串的左侧进行填充。 语法 LPAD(str, len, padstr)其中: str 表示要填充的字符串。len 表示填充后的字符串长度。padstr 表示用于填充的字符串。 如果str长度小于len&#…

基于STM32设计的智能家居远程调温系统(通过红外线控制空调)_75

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 设计的意义1.4 开发工具的选择1.5 系统框架图1.6 系统功能总结1.7 原理图二、硬件选型2.1 ESP8266-串口WIFI2.2 STM32F103C8T6开发板2.3 红外学…

python中的socket使用

目录 一. socket 基础 二. 创建一个 Socket 三. 服务器端 TCP 服务器示例: 四.客户端 TCP 客户端示例: 五. UDP 服务器和客户端 5.1 UDP 服务器示例: 5.2 UDP 客户端示例: 5.3 UDP非阻塞监听 5.3.1 服务端代码&#xf…

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法

题目 2721: 蓝桥杯2022年第十三届决赛真题-背包与魔法 原题链接:完成情况:解题思路:Problem ExplanationCode ExplanationSummary 参考代码:_题目2721_蓝桥杯2022年第十三届决赛真题_背包与魔法 错误经验吸取 原题链接&#xff1…

产品设计职责和量化衡量尺度

产品设计职责和量化衡量尺度 1. 源由2. 职责(Responsibilities)3. 量化矩阵(Quantify Work and Metrics)3. 具体方法(Specific Measures)4. 交付依据(Delivery Product Guidelines)5. 备忘(Memo)6. 补充 - Product Design Responsibilities and Quantitative Metrics6.1 Respon…

Hexo结合多个主题扩展为Gallery画廊并实现文章加密

文章目录 1. 初始化2. 安装加密3. 配置文件4. 创建Token5. 新建公开仓库6. 工作流7. 实现效果1. 加密2. 画廊B主题 可能参考的文章: 如何优雅的使用Github Action服务来将Hexo部署到Github Pages - Hexo 当前PC环境中有Node和Git。版本可以参考Hexo文档。 文章中…

ubuntu的不同python版本的pip安装及管理

ubuntu的不同python版本的pip安装及管理_ubuntu 安装两个pip-CSDN博客https://blog.csdn.net/qq_32277533/article/details/106770850

LRUCache

LRUCache是Android中实现内存缓存相关的组件类,当缓存满时其使用最近最少使用策略来淘汰相关的元素,以控制缓存大小。本文主要基于LRUCache相关源码分析LRUCache的创建、缓存的添加、获取、删除流程。 LRUCache创建 LRUCache的创建可以直接看其构造函数…

SpringBoot的Mybatis-plus实战之扩展功能

文章目录 一、枚举处理器第一步、定义枚举第二步、配置文件中设置 在学习mybatisPlus时会用到扩展功能,极大解放生产力,记录下来,方便备查。 一、枚举处理器 第一步、定义枚举 新建枚举类UserStatusEnum,其主要内容如下所示。 E…

JDBC: 2.初级教程

搭建 依赖 <dependencies><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies> jdbc.properties u…