【springboot单元测试,集成测试】
本文介绍一下SpringBoot中的测试方法
集成测试
@SpringBootTest
一个普通的web api
@RequestMapping
@RestController
public class HelloController {@AutowiredRestTemplate restTemplate;@GetMapping(value = "/api/hi")public Map<String,Object> hello() {String baiduRes = restTemplate.getForObject("https://www.baidu.com", String.class);Map<String, Object> res = new HashMap<>();res.put("status", "中");res.put("msg", baiduRes);return res;}
}
测试类:
package xyz.bliu.sptest;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.client.RestTemplate;import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTest
public class ControllerTest02 {@AutowiredRestTemplate restTemplate;@AutowiredMockMvc mockMvc;@Testpublic void restTemplateShouldNotNull() {assertThat(restTemplate).isNotNull();}@Testpublic void testGetRequest() throws Exception {mockMvc.perform(get("/api/hi")).andExpect(status().isOk()).andDo(print());}
}
使用mockMvc好处是不会启动真实的web服务
当然你可以使用@SpingBootTest 并且注入一个RestTemplate来做真实的请求
假如希望仅仅测试controller层时, 可以使用另外一个注解
@WebMvcTest
他有一个参数可以指定测试的controller
package xyz.bliu.sptest;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.client.RestTemplate;
import xyz.bliu.sptest.controller.HelloController;import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;@WebMvcTest(controllers = HelloController.class)
public class ControllerTest01 {@AutowiredMockMvc mockMvc;@MockBeanRestTemplate restTemplate;@Testpublic void helloShouldOK() throws Exception {when(restTemplate.getForObject("https://www.baidu.com", String.class)).thenReturn("haha");assertThat(mockMvc).isNotNull();mockMvc.perform(get("/api/hi").header("kk", "v1").header("Content-Type", "application/json")).andDo(print()).andExpect(content().contentType("application/json")).andExpect(content().json("{'status':'中', 'msg':'haha'}"));}@Testpublic void restTemplateShouldBeNull() {assertThat(restTemplate).isNull();}
}
这样仅会加载指定的controller和一些web层的东西不会加载其他Bean
假如这个controller中依赖其他的bean怎么办呢?
答案是需要使用@MockBean去Mock依赖的行为
例如我这里的处理
@MockBeanRestTemplate restTemplate;when(restTemplate.getForObject("https://www.baidu.com", String.class)).thenReturn("haha");
其实就是说当调用restTemplate.getForObject(“https://www.baidu.com”, String.class)时,方法会返回“haha”
@WebMvcTest VS @SpringBootTest
显然当你只需要测试你的controller接收请求参数或者返回值时你可以使用@WebMvcTest, 因为它不需要加载整个application context, 因此会使你的test更快
然而当需要集成测试时则需要@SpringBootTest
并且他们是不能同时使用的
-
另外你可能注意到了AssertJ 提供的 assertThat api非常好用,可以流式调用
-
另外本文测试环境为spring boot 3.x 和 Junit5
如果你使用是springboot 2.x 你可能还需要 @RunWith(SpringRuner.class) ( junit4)或者 @extendwith(springextension.class) (junit5)
当然你可以使用@SpingBootTest 并且注入一个RestTemplate来做真实的请求
package xyz.bliu.sptest;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.web.client.RestTemplate;import java.util.Map;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ControllerTest03 {@AutowiredRestTemplate restTemplate;@LocalServerPortint port;@Testpublic void testGet() {Map resp = restTemplate.getForObject("http://localhost:"+port+ "/api/hi", Map.class);assertThat(resp.get("status").toString()).isEqualTo("中");}
}相关文章:
【springboot单元测试,集成测试】
本文介绍一下SpringBoot中的测试方法 集成测试 SpringBootTest 一个普通的web api RequestMapping RestController public class HelloController {AutowiredRestTemplate restTemplate;GetMapping(value "/api/hi")public Map<String,Object> hello() {S…...
【音视频】音视频开发与学习
音视屏开发与学习 时间:2023年8月12日10:09:29 文章目录 音视屏开发与学习1.资料1.资料 1.资料下载: 这是最新的课程视频教程,如有星球过期的朋友,可以在这个群公告或者私聊我拿资料,这个资料会一直发给大家的,已经在星球的就直接在星球获取资料就行:链接:https://pan.…...
软考系统架构之案例篇(架构设计相关概念)
案例篇-架构设计相关概念 1. 架构风格的概念2. 五大架构风格有哪些3. MVC架构含义4. 云计算架构5. 云原生架构设计原则6. ESB的主要功能包括7. 质量属性的含义及其设计策略8. EJB中的 Bean 分三种类型9. 风险点、敏感点、权衡点的含义10. REST 的5个原则 1. 架构风格的概念 软…...
基于大数据的时间序列股价预测分析与可视化 - lstm 计算机竞赛
文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…...
APP分发-CDN加速原理
摘要 CDN的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的…...
【Java 进阶篇】Java Request 继承体系详解
在Java编程中,Request(请求)是一个常见的概念,特别是在Web开发中。Request通常用于获取来自客户端的信息,以便服务器能够根据客户端的需求提供相应的响应。在Java中,Request通常涉及到一系列类和接口&#…...
通过阿里云创建accessKeyId和accessKeySecret
我们想实现服务端向个人发送短信验证码 需要通过accessKeyId和accessKeySecret 这里可以白嫖阿里云的 这里 我们先访问阿里云官网 阿里云地址 进入后搜索并进入短信服务 如果没登录 就 登录一下先 然后在搜索框搜索短信服务 点击进入 因为我也是第一次操作 我们一起点免费开…...
decapoda-research/llama-7b-hf 的踩坑记录
使用transformers加载decapoda-research/llama-7b-hf的踩坑记录。 ValueError: Tokenizer class LLaMATokenizer does not exist or is not currently imported. 解决办法: https://github.com/huggingface/transformers/issues/22222 将tokenizer_config.json中LLa…...
计算机操作系统重点概念整理-第六章 输入输出I/O管理【期末复习|考研复习】
第六章 输入输出I/O管理【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第六章 输入输出I/O管理【期末复习|考研复习】前言六、输…...
uniapp开发小程序—picker结合后台数据实现二级联动的选择
一、效果图 二、完整代码 <template><view><picker mode"multiSelector" change"bindMultiPickerChange" columnchange"bindMultiPickerColumnChange":value"multiIndex" :range"multiArray"><view c…...
React Swiper.js使用(详细版)3D聚焦特效,自定义导航按钮等
共用代码 import swiper/css import swiper/css/navigation import swiper/css/paginationimport { Navigation, Pagination, Scrollbar, A11y, Autoplay, EffectCreative } from swiper/modules;import { Swiper, SwiperSlide, } from swiper/react; 普通版本 重点ÿ…...
零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁
目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护(代码) 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…...
【算法|贪心算法系列No.5】leetcode409. 最长回文串
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
一,操作系统介绍 1.1.什么是操作系统 操作系统(Operating System,简称OS)是一种系统软件,它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源,为应用程序提供接口和服务,并协…...
机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)(2)
KNN-手写数字数据集: 使用sklearn中的KNN算法工具包( KNeighborsClassifier)替换实现分类器的构建,注意使用的是汉明距离; 运行结果:(大概要运行4分钟左右) 代码: import pandas as…...
docker应用部署---nginx部署的配置
1. 搜索nginx镜像 docker search nginx2. 拉取nginx镜像 docker pull nginx3. 创建容器,设置端口映射、目录映射 # 在/root目录下创建nginx目录用于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf# 在~/nginx/conf/下创建nginx.conf文件,粘贴下…...
Sql Server中的表组织和索引组织(聚集索引结构,非聚集索引结构,堆结构)
正文 SqlServer用三种方法来组织其分区中的数据或索引页: 1、聚集索引结构 聚集索引是按B树结构进行组织的,B树中的每一页称为一个索引节点。每个索引行包含一个键值和一个指针。指针指向B树上的某一中间级页(比如根节点指向中间级节点中的…...
C++类对象反制机制实现_精简修改版
前几天写的类对象反射机制太烦锁了,今天写个修改版的,精简为两个类 一个是类的数据结构,另一个是类的父类对象,把所有操作类的方法都写到父类中 1.类的信息结构体 struct Field_Node {TCHAR m_name[20]; //字段名称TCHAR m_typeName[20]; // 字段类型名称size_t m_typeHashC…...
C#开发的IEnumerable接口
C#开发的IEnumerable接口 在前面分析中,我们会遇到下面这行代码: var refineries = self.World.ActorsWithTrait<IAcceptResources>() .Where(r => r.Actor != ignore && r.Actor.Owner == self.Owner && IsAcceptableProcType(r.Actor)) .Select…...
Redis详细安装教程
目录 一、Redis 的安装及启动停止1-1 下载 redis的压缩包1-2 开始解压 redis1-3 执行 make 命令编译1-4 启动 redis修改配置文件1-5 设置远程连接1-6 设置后台启动1-7 设置密码1-8 配置服务启动(使用 systemctl 的方法)启动 redis配置开机启动操作redis使…...
免费LLM API资源全解析:从选型接入到避坑实战指南
1. 项目概述:一个免费LLM API的“藏宝图”如果你最近在捣鼓一些AI小应用,或者想低成本地体验一下大语言模型的能力,大概率会和我一样,被一个问题卡住:去哪里找免费、稳定、还能用的LLM API?市面上各种模型服…...
番茄小说下载器:如何用开源工具构建个人数字图书馆?
番茄小说下载器:如何用开源工具构建个人数字图书馆? 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾经遇到过这样的情况:在手机上追…...
Taotoken 的 Token Plan 套餐如何帮助个人开发者控制预算
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 的 Token Plan 套餐如何帮助个人开发者控制预算 对于个人开发者或小型工作室而言,在探索和集成大模型能力时&…...
终结摄像头依赖:深度拆解 RuView,用商品化 Wi-Fi 信号构建私密、实时的边缘空间智能
发布日期: 2026-02-15 标签: #无线感知 #WiFi感知 #边缘AI #CSI #生命体征监测 #空间智能 一、 引言 在智能家居、智慧医疗和工业安防的落地过程中,传统的“摄像头方案”始终面临着两大难以调和的工程痛点:隐私泄露的法律风险以…...
Checkmate:代码提交前的自动化质量检查工具实战指南
1. 项目概述:一个为开发者打造的代码质量守护者最近在梳理团队内部的代码审查流程,发现一个挺普遍的问题:很多初级开发者,甚至一些有经验的朋友,在提交代码前,对于“代码是否真的准备好了”这件事ÿ…...
掌握kotlin-android-template:Gradle Kotlin DSL配置终极指南
掌握kotlin-android-template:Gradle Kotlin DSL配置终极指南 【免费下载链接】kotlin-android-template Android Kotlin Github Actions ktlint Detekt Gradle Kotlin DSL buildSrc ❤️ 项目地址: https://gitcode.com/gh_mirrors/ko/kotlin-android-tem…...
AI应用开发利器:NeuroAPI网关统一管理多模型调用与部署实战
1. 项目概述:一个面向AI应用开发的API网关最近在折腾AI应用开发的朋友,估计都绕不开一个头疼的问题:模型管理。今天想试试Claude,明天项目需要接入GPT-4,后天可能又要调用一个开源的Llama模型。每个模型都有自己的API地…...
Exynos 5410处理器:big.LITTLE架构与28nm工艺的移动计算革命
1. Exynos 5410处理器:移动计算的新标杆2013年,当智能手机和平板电脑的性能需求开始爆发式增长时,三星推出了Exynos 5410处理器,这款SoC在当时堪称移动计算领域的一次革命。作为全球首款采用big.LITTLE架构的八核处理器࿰…...
Arm Neoverse CMN-650架构与编程实践详解
1. CMN-650架构概述Arm Neoverse CMN-650是一种基于Mesh拓扑的一致性互连网络,专为多核处理器和加速器系统设计。作为SoC内部的数据高速公路,它通过优化的路由算法和一致性协议,实现了高带宽、低延迟的核间通信。1.1 核心组件解析CMN-650由多…...
Rust构建的轻量级文件搜索工具fltr:高性能文本检索新选择
1. 项目概述:一个轻量级、高性能的本地文件搜索工具在开发或日常文件管理工作中,我们常常面临一个看似简单却极其恼人的问题:如何在成千上万的文件中,快速、精准地找到包含特定关键词或符合特定模式的那一个?无论是定位…...
