当前位置: 首页 > news >正文

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

相关文章:

  • 算法笔记刷题日记——3.简单入门模拟 3.1简单模拟
  • 合并分支rebase和merge的区别
  • 新手指南:Postman 旧版本(历史版本)下载
  • Unity类银河恶魔城学习记录1-12 PlayerComboAttack源代码 P39
  • js中原始类型和对象引用
  • 深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之行存(一)
  • canvas设置图形各种混合模式,类似photoshop效果
  • 一篇文章了解系统眼中的键盘--以一个简单的系统分析从按键的输入到字符的显示
  • PyTorch中tensor.backward()函数的详细介绍
  • 微信小程序(三十三)promise异步写法
  • 从源代码看Chrome 版本号
  • 前后端分离,RSA加密传输方案
  • Vue学习笔记之组件基础
  • 基于STM32F103C8的宠物喂食系统设计
  • sui move笔记
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • github指令
  • JDK 6和JDK 7中的substring()方法
  • mysql常用命令汇总
  • MySQL的数据类型
  • React+TypeScript入门
  • React组件设计模式(一)
  • use Google search engine
  • Vue小说阅读器(仿追书神器)
  • 前端攻城师
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何解决微信端直接跳WAP端
  • 使用docker-compose进行多节点部署
  • 听说你叫Java(二)–Servlet请求
  • 写给高年级小学生看的《Bash 指南》
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #{}和${}的区别是什么 -- java面试
  • (1)SpringCloud 整合Python
  • (附源码)springboot教学评价 毕业设计 641310
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)JPA - JQPL 实现增删改查
  • (转)IOS中获取各种文件的目录路径的方法
  • ***检测工具之RKHunter AIDE
  • .htaccess配置常用技巧
  • .NET 8.0 发布到 IIS
  • @RequestMapping处理请求异常
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ linux ] linux 命令英文全称及解释
  • [ASP]青辰网络考试管理系统NES X3.5
  • [Bugku]密码???[writeup]
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C]整形提升(转载)
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [C语言]——C语言常见概念(1)
  • [FFmpeg学习]从视频中获取图片
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HUBUCTF 2022 新生赛]