SpringBoot基础(五):集成JUnit5

news2024/12/24 9:05:55

SpringBoot基础系列文章

SpringBoot基础(一):快速入门

SpringBoot基础(二):配置文件详解

SpringBoot基础(三):Logback日志

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础(五):集成JUnit5


目录

  • 一、JUnit5介绍
    • 1、JUnit5组成结构
    • 2、什么是单元测试
  • 二、SpringBoot整合JUnit5
    • 1、快速入门
    • 2、测试类和测试方法不需要声明为public
    • 3、@SpringBootTest工作原理
    • 4、生成单元测试类
  • 三、常用注解
    • 1、@BeforeAll
    • 2、@AfterAll
    • 3、@BeforeEach
    • 4、@AfterEach
    • 5、@DisplayName
    • 6、@Disabled
    • 7、@RepeatedTest
  • 四、常用断言
    • 1、assertEquals(expected, actual)
    • 2、assertNotEquals(expected, actual)
    • 3、assertTrue(condition)
    • 4、assertFalse(condition)
    • 5、assertNull(actual)
    • 6、assertNotNull(actual)
    • 7、assertArrayEquals(expected, actual)
    • 8、assertSame(expected, actual)
    • 9、assertNotSame(expected, actual)
    • 10、fail(message)
    • 11、带有消息参数的断言
  • 五、@MockBean注入
    • 1、@MockBean的主要作用
    • 2、@MockBean的典型用法(模拟数据层)

一、JUnit5介绍

  JUnit5是一个功能强大的单元测试框架,是JUnit系列的最新版本,它引入了多个改进和新特性,旨在为Java应用程序提供灵活且模块化的测试支持。

1、JUnit5组成结构

  • JUnit Platform:这个模块提供了测试的启动API和运行环境,是整个JUnit5框架的核心。它支持在不同的环境中运行测试,如命令行、IDE或构建工具(例如Maven、Gradle)
  • JUnit Jupiter:这个模块包含了JUnit5的新测试编写和扩展模型,提供了全新的注解、测试方法和扩展机制
  • JUnit Vintage:为了支持旧版本的JUnit测试(JUnit3和JUnit4),JUnit5提供了Vintage模块。这个模块允许开发者继续运行以前版本的测试,同时过渡到JUnit5

2、什么是单元测试

  • 单元测试是指对软件中的最小可测试单元进行检查和验证的过程叫单元测试
  • SpringBoot中,最小可测试单元就是指方法

二、SpringBoot整合JUnit5

1、快速入门

  • SpringBoot版本从2.2以后,默认支持JUnit5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • 测试类应放在src/test/java目录下

在这里插入图片描述

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class MySpringBootApplicationTests {

    @Test
    void contextLoads() {
        // 测试 Spring 应用上下文是否成功加载
    }
}

2、测试类和测试方法不需要声明为public

  • JUnit4中,测试类和测试方法必须是public的,因为JUnit4通过反射机制要求访问公共方法
  • JUnit5则没有这种要求,测试类和方法的可见性设为包级(默认)足够 JUnit 5 框架执行测试
    • 因为 JUnit 5 本质上是在测试框架内部执行这些测试
    • 包级别的可见性允许同一包内的类访问测试类,而不需要将其暴露为 public

3、@SpringBootTest工作原理

  它会启动整个Spring容器,加载应用程序的所有Bean,并创建一个完整的应用上下文。这是集成测试,因为它模拟了应用程序的真实运行环境。

查找主配置类的两种方式:

  包扫描:默认情况下,@SpringBootTest 会从测试类所在的包开始,向上查找同一包或父包中带有 @SpringBootApplication@SpringBootConfiguration注解的类,作为应用的配置类

在这里插入图片描述

  显式指定:如果 @SpringBootTest 无法自动找到 @SpringBootApplication 注解的配置类,或者你希望手动指定配置类,你可以在@SpringBootTest 注解中使用classes属性显式指定应用的配置类

在这里插入图片描述

4、生成单元测试类

  • 在需要生成单元测试的类中按Alt +Ins,选择test(测试)

在这里插入图片描述

  • 选择测试方法

在这里插入图片描述

  • 生成的测试类放入与本类相同的包结构

在这里插入图片描述

三、常用注解

1、@BeforeAll

  • 用于在所有测试方法之前执行的静态初始化代码
  • 通常用于在执行所有测试之前进行一次性设置,例如建立数据库连接、初始化共享资源等
  • 被注解的方法必须是static
@BeforeAll
static void setup() {
    System.out.println("Running setup before all tests...");
}

2、@AfterAll

  • 用于在所有测试方法执行完成后运行的静态清理代码
  • 通常用于释放资源、关闭连接等操作
  • 被注解的方法必须是static
@AfterAll
static void tearDown() {
    System.out.println("Running teardown after all tests...");
}

3、@BeforeEach

  • 用于在每个测试方法之前执行的初始化代码
  • 常用于在每个测试方法执行之前准备一些通用的数据或环境
@BeforeEach
void init() {
    System.out.println("Running setup before each test...");
}

4、@AfterEach

  • 用于在每个测试方法之后执行的清理代码
  • 常用于在每个测试方法之后恢复原状或清理一些资源
@AfterEach
void cleanup() {
    System.out.println("Running cleanup after each test...");
}

5、@DisplayName

  • 用于为测试类或测试方法提供一个更具可读性或说明性的名称,便于在测试报告中展示

在这里插入图片描述

6、@Disabled

  • 当执行所有测试方法时候,@Disabled注解的方法不会执行

在这里插入图片描述

7、@RepeatedTest

  • 用于多次重复执行某个测试,可以指定重复次数

在这里插入图片描述

四、常用断言

  断言(Assertions)在单元测试中用于验证程序行为是否符合预期。JUnit 提供了一组用于编写断言的方法,断言的使用可以帮助判断测试是否通过。类名org.junit.jupiter.api.Assertions

1、assertEquals(expected, actual)

  • 验证两个对象是否相等
  • 可以用于各种数据类型,包括基本类型、对象等
assertEquals(5, 2 + 3);
assertEquals("Hello", greetingService.getGreeting());

2、assertNotEquals(expected, actual)

  • 验证两个对象是否不相等
assertNotEquals(10, 2 + 3);

3、assertTrue(condition)

  • 验证条件为true
assertTrue(5 > 3);

4、assertFalse(condition)

  • 验证条件为false
assertFalse(3 > 5);

5、assertNull(actual)

  • 验证对象是否为null
String str = null;
assertNull(str);

6、assertNotNull(actual)

  • 验证对象是否不为null
String str = "Hello";
assertNotNull(str);

7、assertArrayEquals(expected, actual)

  • 验证两个数组是否相等
  • 数组的长度和元素的顺序都必须相同
int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);

8、assertSame(expected, actual)

  • 验证两个对象引用是否指向同一个对象(即是同一个对象的引用)
Object obj = new Object();
assertSame(obj, obj);

9、assertNotSame(expected, actual)

  • 验证两个对象引用是否不指向同一个对象
Object obj1 = new Object();
Object obj2 = new Object();
assertNotSame(obj1, obj2);

10、fail(message)

  • 强制使测试失败
  • 通常用于标记不应该被执行的代码路径
if (someCondition) {
    fail("Unexpected condition occurred");
}

11、带有消息参数的断言

  JUnit的断言方法通常有一个变体,可以带有一个额外的字符串参数,用于在测试失败时提供错误消息,帮助更快找到问题。

在这里插入图片描述

五、@MockBean注入

1、@MockBean的主要作用

  • @MockBean会将应用上下文中的某个Bean替换为模拟的Bean(Mock 对象)
  • @MockBean自动与Spring上下文集成,允许模拟的Bean被注入到需要它的其他Bean中

2、@MockBean的典型用法(模拟数据层)

  假设我们有一个UserService依赖于UserRepository,而我们在测试中不想使用真实的UserRepository,而是使用模拟对象

@Service
public class UserService {

    private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id);
    }
}

  • 使用@MockBean来模拟UserRepository
  • given方法模拟了userRepository.findById(1L) 方法的调用,并定义了当该方法被调用时,willReturn表示返回一个mockUser对象
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    // 模拟 UserRepository,替换掉应用上下文中的实际 Bean
    @MockBean
    private UserRepository userRepository;

    @Test
    void testGetUserById() {
        // 创建模拟数据
        User mockUser = new User(1L, "John Doe");

        // 使用 Mockito 的 BDD 风格方法设置模拟行为
        given(userRepository.findById(1L)).willReturn(mockUser);

        // 调用服务层方法,验证返回值是否符合预期
        User result = userService.getUserById(1L);
        assertEquals("John Doe", result.getName());
    }
}

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

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

相关文章

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题

在.NET Core 项目部署后&#xff0c;我们往往会遇到内存占用越来越高的问题&#xff0c;但是由于项目部署在Linux上&#xff0c;因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先&#xff0c;我们来看一下应用…

Python | Leetcode Python题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, radius: float, x_center: float, y_center: float):self.xc x_centerself.yc y_centerself.r radiusdef randPoint(self) -> List[float]:u, theta random.random(), random.random() * 2 * mat…

rancher hello-world

创建一个Deployment, 只填名称和容器镜像rancher/hello-world 成功后: 查看日志 结果&#xff1a; 部署了工作负载。这个过程可能需要几分钟完成。 当您的工作负载部署完成后&#xff0c;它的状态将变为Active&#xff0c;您可以从项目的工作负载页面查看工作负载当前的状态…

Golang | Leetcode Golang题解之第475题供暖器

题目&#xff1a; 题解&#xff1a; func findRadius(houses, heaters []int) (ans int) {sort.Ints(houses)sort.Ints(heaters)j : 0for _, house : range houses {dis : abs(house - heaters[j])for j1 < len(heaters) && abs(house-heaters[j]) > abs(house-…

threejs 前言

Three.js 中文官方网站 一、项目结构 二、相关开源库 下面表格列举了一些Three.js相关的开源库。

【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别

一、K8s的Deployment与StatefulSets 在K8s中&#xff0c;Deployment将Pod部署成无状态的应用程序&#xff0c;它只关心Pod的数量、Pod更新方式、使用的镜像和资源限制等。由于是无状态的管理方式&#xff0c;因此Deployment中没有角色和顺序的概念&#xff0c;换句话说&#xf…

关于VS Studio2022如何使用scanf函数

前言&#xff1a; 小编在最近给别人安装VS2022的时候&#xff0c;忘记让他弄一段代码来解决VS不能使用scanf函数这个问题了&#xff0c;导致他编写代码的时候出错了&#xff0c;小编考虑到可能有一些读者朋友同样也会遇到这种问题&#xff0c;于是我就写下了这一篇文章来帮助一…

并发编程-线程池

并发编程-线程池 本篇我们主要围绕线程池的原理以及源码进行分析&#xff0c;事实上线程池本身并不是什么新的技术&#xff0c;而是在池化技术的思想上把一些工具类整合起来。话不多说&#xff0c;我们开始进入正题。我们先来认识一下什么是线程池 概念 线程池&#xff08;T…

Linux进程间通信(一)——管道通信

目录 前言 1.管道实现进程间通信 ①管道的所属问题 ②匿名管道通信 ③命名管道通信 2.使用管道通信实现一个进程池 ①进程池类图 ②Channel类实现 ③ProcessPoll类实现 ④代码一览 前言 在学习Linux中的进程时&#xff0c;曾提到过进程的独立性。进程独立性的是进程与进程之间…

SpringMVC后台控制端校验-表单验证深度分析与实战优化

前言 在实战开发中&#xff0c;数据校验也是十分重要的环节之一&#xff0c;数据校验大体分为三部分&#xff1a; 前端校验后端校验数据库校验 本文讲解如何在后端控制端进行表单校验的工作 案例实现 在进行项目开发的时候,前端(jquery-validate),后端,数据库都要进行相关的数据…

【数据结构】图的最短路径

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C游记》《进击的C》《Linux迷航》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、最短路径的概念二、Dijkstra算法2.1 思想2.2 实现 三、Bellman-Ford算法3.1 思想3.2 实现 四、Floyd-Warsh…

操作教程|基于DataEase用RFM分析法分析零售交易数据

DataEase开源BI工具可以在店铺运营的数据分析及可视化方面提供非常大的帮助。同样&#xff0c;在用于客户评估的RFM&#xff08;即Recency、Frequency和Monetary的简称&#xff09;分析中&#xff0c;DataEase也可以发挥出积极的价值&#xff0c;通过数据可视化大屏的方式实时展…

液态神经网络 LNN

神经网络 (NN) 是 机器学习 模仿人脑结构和运算能力以从训练数据中识别模式的算法。 通过处理和传输信息的互连人工神经元网络&#xff0c;神经网络可以执行复杂的任务&#xff0c;例如 人脸识别, 自然语言理解&#xff0c;以及无需人工协助的预测分析。 尽管神经网络是一种强…

Mac电脑SourceTree git账号密码更改提示再次输入密码

前言&#xff1a; 最近小编git账号密码修改了&#xff0c;之前在sourceTree的git仓库在拉代码提交代码就会报错&#xff0c;提示因为密码导致的仓库连接失败。 解决方案 1.在mac电脑应用程序中搜索“钥匙串” 点击钥匙串访问 在钥匙串中选登录&#xff0c;在在右侧列表中找…

key形式和key/value形式二叉树

首先模拟一下key形式类 使用的结构是搜索二叉树 结点中有左孩子和右孩子 还有一个存储的值 template <class K>struct BSTnode//搜索二叉树不支持修改 中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key…

【C++】12.string类的使用

文章目录 1. 为什么学习string类&#xff1f;1.1 C语言中的字符串1.2 两个面试题(暂不做讲解) 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for 3. 查看技术文档4. string的访问5. 如何读取每个字符呢&#xff1f;6. auto语法糖&#xff08;C11&#xff09;7. 范围f…

spring boot 2.7整合Elasticsearch Java client + ingest attachment实现文档解析

一、软件环境 软件版本号备注Spring boot2.7.23.x版本建议使用ElasticSearch8.xElasticSearch7.17.4ElasticSearch 7.x 可使用JDK 8 ElasticSearch 8.x 要求使用JDK 11 二、安装ElasticSearch 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/el…

网站建设中,虚拟主机的各项指标和参数

虚拟主机的各项指标和参数主要包括空间大小、并发连接数、带宽限制、流量限制、CPU限制、内存以及IO速度等。以下是对这些指标和参数的详细介绍&#xff1a; 空间大小&#xff1a;空间大小通常以MB或GB为单位&#xff0c;表示虚拟主机可以容纳的数据量。例如&#xff0c;一个1…