【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!"));}}

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

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

相关文章

前端JavaScript篇之JavaScript有哪些内置对象

目录 JavaScript有哪些内置对象常见的内置对象的简单描述和参考代码总结 JavaScript有哪些内置对象 JavaScript中常见的内置对象包括&#xff1a; Object&#xff1a;用于创建对象的构造函数&#xff0c;对象是键值对的集合&#xff0c;用于存储和传递数据。 Array&#xff1…

【C语言】内联函数总结

内联函数定义 inline关键字是C99标准的型关键字&#xff0c;其作用是将函数展开&#xff0c;把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码&#xff0c;而不发生跳转、压栈等一般性函数操作。可以节省时间&#xff0c;也会提高程序的执行速度。 …

python计算两个DataFrame的指定两列中,相同的数据有多少

目的&#xff1a;查询数据1和数据2中&#xff0c;red与red列相同 并且blue与blue列相同的&#xff0c;情况有多少。 &#xff08;备注&#xff1a;两个数据中格式不一致&#xff0c;需要经过json提取等处理步骤&#xff09; 思路步骤&#xff1a; 1、读取数据1&#xff0c;筛选…

2024/2/3 备战蓝桥杯 4-2 排序

目录 错误票据 0错误票据 - 蓝桥云课 (lanqiao.cn) 奖学金 0奖学金 - 蓝桥云课 (lanqiao.cn) 错误票据 0错误票据 - 蓝桥云课 (lanqiao.cn) 特点&#xff1a;不知道每一行要输入的数字有多少个&#xff0c;一共要输入n行数字 可以这样写&#xff1a; for(int i 0;i &l…

蓝桥杯经典 年号字串

年号字串 【问题描述】 小明用字母 A 对应数字 1&#xff0c;B 对应 2&#xff0c;以此类推&#xff0c;用 Z 对应 26。对于 27 以上的数 字&#xff0c;小明用两位或更长位的字符串来对应&#xff0c;例如 AA 对应 27&#xff0c;AB 对应 28&#xff0c;AZ 对应 52&#xff0…

【MongoDB】跨库跨表查询(python版)

MongoDB跨表跨库查询 1.数据准备&#xff1a;2.跨集合查询3.跨库查询应该怎么做&#xff1f; 讲一个简单的例子&#xff0c;python连接mongodb做跨表跨库查询的正确姿势 1.数据准备&#xff1a; use order_db; db.createCollection("orders"); db.orders.insertMan…

秦厚荣简历

秦厚荣&#xff0c;男&#xff0c;汉族&#xff0c;1962年出生于江苏省&#xff0c;南京大学数学系教授&#xff0c;首批入选国家“百千万人才计划”&#xff0c;享受国务院特殊津贴。现为中共南京大学委员会委员、数学系党委书记&#xff0c;江苏省数学学会理事长&#xff0c;…

2021-10-12 51蛋骗鸡数码管前7位显示1-7第8位显示0-9

缘由 51单片机数码管问题-编程语言-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; bit k1,wk0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128,255,64};//0-9.消隐- unsigned char Js0,miao0,fen…

【MIT 6.S081】2020, 实验记录(5),Lab: lazy allocation

目录 Task 1: Eliminate allocation from sbrk()Task 2: Lazy allocationTask 3: Lazytests and Usertests 在学习了 page fault 这一节课后&#xff0c;了解了操作系统是如何结合 page table 和 trap 利用 page fault 来实现一系列的神奇的功能。这个 lab 就是在 XV6 中实现 l…

Java 数据类型详解与类型转换技巧

Java 数据类型 Java 中的变量必须是指定的数据类型&#xff1a; int myNum 5; // 整数 float myFloatNum 5.99f; // 浮点数 char myLetter D; // 字符 boolean myBool true; // 布尔值 String myText "Hello"; // 字符串数…

Codeforces Round 651 (Div. 2)C 博弈 奇偶数 偶数的表示

Submission #244500083 - Codeforces 题目&#xff1a; 思路&#xff1a; 此题要从奇偶性上入手。&#xff08;注意除的是奇因数&#xff0c;即一个奇数。我想成质数了&#xff09; 1.当A选手开局是1时&#xff0c;A败。 2.当A选手开局是2和奇数时&#xff0c;A必胜。&…

【Qt加密播放器】登录窗口功能补充

输入框小设计 目的&#xff1a;实现鼠标点击输入框时的聚焦效果。 首先在LoginForm构造函数中为账号和密码输入框添加事件过滤器。关于事件过滤器的具体介绍可以参考这篇博文&#xff1a;Qt消息机制和事件 ui->nameEdit->installEventFilter(this); ui->pwdEdit->…

常用换源总结

1.Ubuntu16.04更换国内源 在Ubuntu系统上使用apt-get install进行软件安装或更新的时候&#xff0c;由于使用的是国外源&#xff0c;导致下载速度很慢或者连接超时&#xff0c;需要更换下载源。 1.将系统原始的源文件进行备份 sudo cp /etc/apt/sources.list /etc/apt/source…

docker踩坑记录

踩坑记录 1.1 后台启动容器&#xff0c;实际没有启动 现象&#xff1a; 后台启动centos&#xff0c;结果执行docker ps命令&#xff0c;容器没启动。 原因&#xff1a; docker是以容器启动的&#xff0c;必须要有个前台进程&#xff0c;若是全部都是后台deamon守护进程&…

ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战

文章目录 ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战一、LangGPT是什么?二、远古诗人 vs 现代诗人三、LangGPT Role模板实战 - 甩锅王Role模板特征提取四、 用AI实现提示词结构化ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战 一、LangGPT是什么? 随着大模型…

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题&#xff0c;你该了解这些&#xff01; 01 背包 二维dp数组01背包 &#x1f4bb;实现代码 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 一维dp数组&#xff08;滚动数组&#xff09; &#x1f4bb;实现代码 416. 分割等和子集 &#x1f…

前后端数据校验

前端校验内容 前端开发中的必要校验&#xff0c;可以保证用户输入的数据的准确性、合法性和安全性。同时&#xff0c;这些校验也有助于提供良好的用户体验和防止不必要的错误提交到后端。 1、必填字段校验&#xff1a; 对于必填的字段&#xff0c;需确保用户输入了有效的数据…

二叉树可视化

二叉树可视化 运行演示代码和程序已上传二叉树知识平衡二叉树红黑树最优二叉搜索树哈夫曼树KD树B树和B树 参考 运行演示 学习二叉树总是脑补图像&#xff0c;实在是恶心&#xff0c;就想写一个能可视化的二叉树&#xff0c;结果没控制好&#xff0c;功能越想越多&#xff0c;先…

腾讯面试题

目录 1 tcp可靠性&#xff0c;然后问十六位校验和怎么实现的 2 TCP粘包 3 进程协程线程 4 跳表怎么实现 5 gostruct能不能比较&#xff1f; 6 godefer&#xff08;fordefer&#xff09; 7 go select可以用于什么&#xff1f; 8 client如何实现长连接&#xff1f; 1. …

uniapp本地存储的几种方式localStorage

在uniapp开发中&#xff0c;本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据&#xff0c;以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式&#xff0c;以及相关的代码示例。 介绍 在移动应用开发中&#xff0c;我们经常需要将…