【Springboot】单元测试Junit5应用
JUnit 5是一个功能强大的测试框架,常用于编写和执行这些单元测试。以下是一些JUnit 5中的常用注解、断言、前置条件、嵌套测试和参数化测试的例子:
1.环境启动
@SpringBootTest 注解:
classes = SmartApplication.class:这个属性指定了一个或多个Spring Boot应用程序的启动类(入口点)。在测试中使用启动类可以让Spring Boot应用程序的上下文被加载,以便进行测试。
webEnvironment属性:
- NONE: 不启动任何Web相关的环境,通常用于不需要Web环境的测试。
- RANDOM_PORT: 随机分配一个端口来启动Web环境。
- ANY: 使用第一个可用端口来启动Web环境。
- MOCK: 使用MockMvc来模拟Web环境,而不用启动真实的Web服务器。
- DEFINED_PORT: 使用在@LocalServerPort或@Value注解中定义的端口来启动Web环境。使用配置文件中定义好的端口
@SpringBootTest(classes = SmartApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class JunitApplicationTests {@AutowiredTestService testService;@Testvoid contextLoads() {System.err.println("测试启动");System.out.println(testService.test());}}
2. 常用注解
- @Test:用于标记一个方法作为测试方法。
- @BeforeEach:在每个测试方法之前执行一次。
- @AfterEach:在每个测试方法之后执行一次。
- @BeforeAll:在所有测试方法之前执行一次。
- @AfterAll:在所有测试方法之后执行一次。
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;public class MyServiceTest {private MyService service;@BeforeAllpublic static void setup() {// 在所有测试之前执行的代码}@BeforeEachpublic void setupEachTest() {// 在每个测试之前执行的代码service = new MyService();}@AfterEachpublic void teardown() {// 在每个测试之后执行的代码}@AfterAllpublic static void teardown() {// 在所有测试之后执行的代码}@Testpublic void myTestMethod() {// 测试逻辑}
}
3.模拟发送HTTP请求
断言
- Assertions.assertEquals(expected, actual):断言期望值与实际值相等。
- Assertions.assertNotEquals(unexpected, actual):断言期望值与实际值不等。
- Assertions.assertNull(object):断言对象为null。
- Assertions.assertNotNull(object):断言对象不为null。
- Assertions.assertTrue(condition):断言条件为true。
- Assertions.assertFalse(condition):断言条件为false。
使用RestTemplate发送请求
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = YourApplication.class)
public class YourControllerTest {@Autowiredprivate RestTemplate restTemplate;@Testpublic void should_handle_request_correctly() {// 模拟请求String url = "http://example.com/api";HttpEntity<String> request = new HttpEntity<>("some request body", headers);// 发送请求ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);// 断言assertEquals(HttpStatus.OK, response.getStatusCode());assertEquals("expected response body", response.getBody());}
}
使用Mock发送请求
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;import java.util.HashMap;
import java.util.Map;import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;import com.example.yourproject.controller.YourController;@ExtendWith(MockitoExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class YourControllerTest {@Mockprivate YourController yourController;private MockMvc mockMvc;@BeforeEachpublic void setUp() {mockMvc = MockMvcBuilders.standaloneSetup(yourController).build();}@Testpublic void testYourController() throws Exception {// 准备请求参数Map<String, String> requestParams = new HashMap<>();requestParams.put("param1", "value1");requestParams.put("param2", "value2");// 设置模拟的响应String expectedResponse = "{\"message\":\"Hello World!\"}";when(yourController.yourMethod(requestParams)).thenReturn(expectedResponse);// 发送请求并验证结果mockMvc.perform(MockMvcRequestBuilders.post("/your-endpoint").contentType(MediaType.APPLICATION_JSON).content(JSON.toJSONString(requestParams))).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!"));}}相关文章:
【Springboot】单元测试Junit5应用
JUnit 5是一个功能强大的测试框架,常用于编写和执行这些单元测试。以下是一些JUnit 5中的常用注解、断言、前置条件、嵌套测试和参数化测试的例子: 1.环境启动 SpringBootTest 注解: classes SmartApplication.class:这个属性…...
【INTEL(ALTERA)】内部错误:子系统:PTI,文件:/quartus/tsm/pti/pti_delay_annotator.cpp
说明 由于英特尔 Quartus Prime Pro Edition 软件 23.2 及更早版本存在问题,因此在编译设计的 Retime 期间可能会出现此错误。 解决方法 此问题已在英特尔 Quartus Prime Pro Edition 软件 v23.3 中修复。 要在版本 23.2 中解决此问题,请通过以下相应链…...
大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置
上一篇: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 目录 1. 🥙Idea中配置Live Templates来快速生成代码片段 2. 🥙Idea中配置文件模板自定义初始代码 3.🥙设置spark-submit提交程…...
android 设置未知来源等 AppOpsManager 权限的设置接口
开始客户让我们执行下面的CMD 代码 adb shell appops set com.android.chrome REQUEST_INSTALL_PACKAGES allow 后来 GTP 告诉我有 Setmode的方法,后面在设置里面找到了 OP_REQUEST_INSTALL_PACKAGES 这个,里面有个方法mAppOpsManager.setMode(AppOp…...
使用GPT实现一个简单的网站
背景 In this exciting tutorial video, you’ll discover how to use 文心一言, a powerful language model developed by 百度, to generate ReactJS code for a simple blog website. With 文心一言’s help, you can quickly create a blog website that’s easy to custom…...
回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)
回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注…...
11:Servlet中初始化参数的获取与应用-Java Web
目录 11.1 Servlet初始化参数简介11.2 如何在Servlet中获取初始化参数11.3 基于注解的初始化参数(Servlet 3.0)11.4 区别总结11.5 应用场景总结 在构建Java Web应用程序时,Servlet是核心组件之一,它负责处理HTTP请求并生成响应。而…...
STM32的ADC采集传感器的模拟量数据
1、 由于项目上使用传感器采集数据,传感器可以输出模拟电压信号,但是模拟电压信号的输出范围是1-5V,而STM32的ADC采集电压范围是0-3.3V,此时可以用一个简单的分压电路将1-5V的电压将至0.5V到2.5V的范围。 2、电阻分压电路可以使用…...
opencvb 十七 使用cmake配置opencv c++项目
1、cmake简介 1.1 cmake是什么 CMake是一个开源、跨平台的编译(Build)工具,是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特…...
Java8 中文指南(一)
Java8 中文指南(一) 文章目录 Java8 中文指南(一)《Java8 指南》中文翻译接口的默认方法(Default Methods for Interfaces)Lambda 表达式(Lambda expressions)函数式接口(Functional Interfaces)方法和构造函数引用(Method and Co…...
引流技术-通过文件中增加联系方式并传播
文章目录 前言文档增加联系方式扩散网盘扩散自建网站借力 注意 前言 很多人在找资料的时候可能都遇到过下图情况: 1、文档最后面留一个自己的联系方式; 2、找的一堆文件中都有相同的情况; 3、一段时间全网搜到的很多相同文件也有这个联系方式…...
分布式搜索引擎_学习笔记_2
分布式搜索引擎_学习笔记_2 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用…...
【学习笔记】树上差分总结(点差分/边差分)
一.树上差分的基本概念 1.树上差分的定义 树上差分,顾名思义,意思就是在树上做差分。 至于什么是差分呢?如果不会的同学,可以先看看我的这篇博客:一维,二维差分の详解(简单易懂)_一维差分-CSDN博客 2.树…...
Vue.js设计与实现(霍春阳)
Vue.js设计与实现 (霍春阳) 电子版获取链接:Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 :1.对Vue.js 2/3具有上手经验,且希望进一步理解Vue.js框架设计原理的开发人员; 2.没有使用过Vue.js,但对Vue.js框架设计感兴趣…...
go消息队列RabbitMQ - 订阅模式-fanout
1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…...
科普类——5G远程实时操控技术在国内港口应用简介(十三)
在中国,5G远程实时操控技术已经在多个港口得到应用,并且应用规模不断扩大,展现出良好的发展前景。以下是一些具体的应用案例: 上港集团洋山港:上港集团与华为合作,在全球港口首次将F5G技术应用于超远程控制…...
整理:汉诺塔简析
大体上,要解决一个汉诺塔问题,就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C,就要: 将两个盘子从 A 移动到 B(子问题 1) 为了解决子问题 1,就…...
Android 8.1 设置--声音中增加通话音量
Android 8.1 设置--声音中增加通话音量 近来收到项目需求,想要在设置--声音中增加一项通话音量调节,具体修改参照如下: /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml <!-- Sound: Title for the opt…...
C#中使用OpenCvSharp4绘制直线、矩形、圆、文本
C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字,将之前的Python和C示例代码翻译成C#语言,很简单,还是借用OpenCvSharp4库中的Line、…...
Qt程序设计-自定义控件(提升法)
本文讲解如何使用提升法自定义控件,控件有界面。 实现自定义一个开关控件,控件上显示当前的状态。实现过程如下: 1、在创建的项目上,添加qt设计界面类。 2、选择widget 3、更改名称为MySwitchButton 4、添加两个图标资源文件,用来显示开关状态 5、添加两个label,一个…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
