在 Spring 中编写单元测试

单元测试是软件开发过程中不可或缺的一部分,它能有效地提高代码质量,确保代码功能的正确性。在 Spring 应用中,JUnit 和 Mockito 是常用的单元测试工具,而 Spring Test 提供了丰富的测试支持。本文将介绍如何在 Spring 中使用 JUnit、Mockito 和 Spring Test 进行单元测试。

1. 引入必要的依赖

首先,在 pom.xml 文件中添加 JUnit、Mockito 和 Spring Test 的依赖:

<dependencies><!-- JUnit 5 依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.8.1</version><scope>test</scope></dependency><!-- Mockito 依赖 --><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.0.0</version><scope>test</scope></dependency><!-- Spring Test 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.5.6</version><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
</dependencies>

2. 使用 JUnit 编写单元测试

JUnit 是最流行的 Java 单元测试框架。我们将使用 JUnit 5 编写一个简单的单元测试。

假设我们有一个 CalculatorService 类:

public class CalculatorService {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}

我们可以为其编写如下测试类:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;public class CalculatorServiceTest {private final CalculatorService calculatorService = new CalculatorService();@Testpublic void testAdd() {assertEquals(5, calculatorService.add(2, 3));}@Testpublic void testSubtract() {assertEquals(1, calculatorService.subtract(3, 2));}
}

3. 使用 Mockito 进行单元测试

Mockito 是一个用于创建模拟对象的流行框架,特别适用于测试依赖注入的类。假设我们有以下 UserService 类和 UserRepository 接口:

public interface UserRepository {User findByUsername(String username);
}public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserByUsername(String username) {return userRepository.findByUsername(username);}
}

我们可以使用 Mockito 为 UserService 编写单元测试:

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 UserServiceTest {private UserRepository userRepository;private UserService userService;@BeforeEachpublic void setUp() {userRepository = Mockito.mock(UserRepository.class);userService = new UserService(userRepository);}@Testpublic void testGetUserByUsername() {User user = new User("john_doe");when(userRepository.findByUsername("john_doe")).thenReturn(user);User result = userService.getUserByUsername("john_doe");assertEquals("john_doe", result.getUsername());}
}

4. 使用 Spring Test 进行单元测试

Spring Test 提供了对 Spring 应用的全面测试支持。通过 @SpringBootTest 注解,可以加载整个 Spring 应用的上下文进行集成测试。

假设我们有一个简单的 Spring Boot 应用,包括 UserControllerUserService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user")public User getUser(@RequestParam String username) {return userService.getUserByUsername(username);}
}

我们可以使用 Spring Test 编写如下测试类:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetUser() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/user").param("username", "john_doe")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.username").value("john_doe"));}
}

结论

通过本文的介绍,我们了解了如何在 Spring 应用中使用 JUnit、Mockito 和 Spring Test 进行单元测试。JUnit 提供了基础的测试框架,Mockito 允许我们方便地创建模拟对象,而 Spring Test 则提供了对 Spring 应用的全面测试支持。

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

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

相关文章

并行处理百万个文件的解析和追加

处理和解析大量文件&#xff0c;尤其是百万级别的文件&#xff0c;是一个复杂且资源密集的任务。为实现高效并行处理&#xff0c;可以使用Python中的多种并行和并发编程工具&#xff0c;比如multiprocessing、concurrent.futures模块以及分布式计算框架如Dask和Apache Spark。这…

物联网时代5G通信技术分析研究一、引言

一、引言 近几年&#xff0c;移动网络技术跟随互联网的不断发展而改革和进步&#xff0c;给平民大众的生活也带来新的尝试与影响。从2G网络的出现&#xff0c;到逐步被社会民众所了解的3G&#xff0c;再到被熟知的且正在服务于大家的4G网络&#xff0c;移动网络技术的发展速度令…

jQuery Mobile 安装指南

jQuery Mobile 安装指南 jQuery Mobile 是一个基于 jQuery 的移动设备友好的网页开发框架,它允许开发者创建响应式网页和应用程序。本指南将详细介绍如何安装 jQuery Mobile,并确保您的开发环境准备好进行移动网页开发。 1. 环境准备 在开始安装 jQuery Mobile 之前,请确…

Mysql系列-Binlog主从同步

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/669450627 一、主从同步概述 mysql主从同步&#xff0c;即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主 从同步功能&#xff0c;经过配置&#xff0c;可以实现基于库、表…

B端设计:任何不顾及用户体验的设计,都是在装样子,花架子

B端设计是指面向企业客户的设计&#xff0c;通常涉及产品、服务或系统的界面和功能设计。与C端设计不同&#xff0c;B端设计更注重实用性和专业性&#xff0c;因为它直接影响企业的效率和利益。 在B端设计中&#xff0c;用户体验同样至关重要。不顾及用户体验的设计只是空洞的表…

数据库之索引(二)

目录 一、如何判断数据库的索引是否生效 二、如何评估索引创建的是否合理 三、索引是否越多越好 四、如何处理数据库索引失效 五、是否所有的字段都适合创建索引 一、如何判断数据库的索引是否生效 可以使用EXPLAIN语句查看索引是否正在使用。 例如&#xff0c;假设已经创…

70.Bug:使用list.sort(Comparator.Comping(User::getCreateTime).reverse())空指针异常

1.出错原因&#xff1a;在xml中没有做字段映射 报错语句复现&#xff1a; List<User> listnew ArrayList<>()&#xff1b; xml中进行查询数据&#xff0c;数据存放在list中........... //排序 list.sort(Comparator.Comping(User::getCreateTime).reverse())&…

经典的layui框架,还有人用吗?令人惋惜。

自从layui官网宣布关闭之后&#xff0c;layui框架的用户飞速下滑&#xff0c;以至于到现在贝格前端工场承接的项目中&#xff0c;鲜有要求使用layui框架的&#xff0c;那么个框架还有人用吗&#xff1f; 一、layui没落是不是jquery惹的祸 layui的没落与jQuery无关。layui框架…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

深入理解 Docker 容器技术

一、引言 在当今的云计算和软件开发领域&#xff0c;Docker 容器技术已经成为了一项不可或缺的工具。它极大地改变了应用程序的部署和运行方式&#xff0c;为开发者和运维人员带来了诸多便利。 二、Docker 容器是什么&#xff1f; Docker 容器是一种轻量级、可移植、自包含的…

起底:Three.js和Cesium.js,二者异同点,好比全科和专科.

Three.js和Cesium.js是两个常用的webGL引擎&#xff0c;很多小伙伴容易把它们搞混淆了&#xff0c;今天威斯数据来详细介绍一下&#xff0c;他们的起源、不同点和共同点&#xff0c;阅读后你就发现二者就像全科医院和专科医院的关系&#xff0c;很好识别。 一、二者的起源 Th…

性能测试相关理解---性能测试流程(二)

六、性能测试流程&#xff08;如何做性能测试&#xff1f;) 根据学习全栈测试博主的课程做的笔记 1、前期准备– 项目初期就开始&#xff0c;业务需求评审时尽量参与,对业务更深刻的认识&#xff08;确定哪些是核心业务、哪些可能存在并发请求、确定什么地方会出现瓶颈,方便后…

WebOffice在线编微软Offfice,并以二进制流的形式打开Word文档

在日常办公场景中&#xff0c;我们经常会遇到这种场景&#xff1a;我们的合同管理系统的各种Word,excel,ppt数据都是以二进制数组的形式存储在数据库中&#xff0c;如何从数据库中读取二进制数据&#xff0c;以二进制数据作为参数&#xff0c;然后加载到浏览器的Office窗口&…

【无标题】地平线2西之绝境/Horizon Forbidden West™ Complete Edition(更新:V1.3.57)

游戏介绍 与埃洛伊同行&#xff0c;在危险壮美的边疆之地揭开种种未知的神秘威胁。此完整版可完整享受广受好评的《地平线 西之绝境™》内容和额外内容&#xff0c;包括在主线游戏后展开的后续故事“炙炎海岸”。 重返《地平线》中遥远未来的后末日世界&#xff0c;探索远方的土…

Twitter群发消息API接口的功能?如何配置?

Twitter群发消息API接口怎么申请&#xff1f;如何使用API接口&#xff1f; 为了方便企业和开发者有效地与用户互动&#xff0c;Twitter提供了各种API接口&#xff0c;其中Twitter群发消息API接口尤为重要。AokSend将详细介绍Twitter群发消息API接口的功能及其应用场景。 Twit…

html+css+js贪吃蛇游戏

贪吃蛇游戏&#x1f579;四个按钮控制方向&#x1f3ae; 源代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代码&#x1f4df; <!DOCTYPE html> <html lang"en"&…

15jQuery引入

【一】什么是jQuery jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery内部封装了原生的js代码&#xff0c;提高编写效率 【二】jQuery引入配置 1.● 代码复制下来放到自己建的txt中&#xff0c;然后把他移入pycharm项目中重构成js文件(注意&#xff1a;只能在当前…

win10使用小技巧三

1. 添加照片查看器支持 目的&#xff1a;为Windows 10添加对特定图片格式&#xff08;如JPG&#xff09;的支持&#xff0c;使用Windows照片查看器。步骤&#xff1a; 使用WinR打开运行窗口。输入regedit&#xff0c;点击确定进入注册表编辑器。导航至HKEY_CURRENT_MACHINE\SO…

tomcat原理、结构、设计模式

1 what 一种web服务器&#xff0c;运行java servlet、jsp技术&#xff0c;能为java web提供运行环境并通过http协议处理客户端请求。即tomcat http服务器 servlet容器。同类产品有jetty Web应用&#xff1a;Web应用是指通过Web浏览器访问的应用程序&#xff0c;它使用Web技术…

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始&#xff0c;Android 15 达成了平台稳定性里程碑版本&#xff0c;这意味着开发者 API 和所有面向应用的行为都已是最终版本&#xff0c;您可以查阅它们并将其集成到您的应用中&#xff0c;并…