Spring 集成测试指南

在软件开发中,集成测试是一种重要的测试方法,用于验证应用程序各个模块之间的协同工作是否正常。Spring 提供了强大的 Spring Test 模块,以及 MockMvc 工具来进行 HTTP 请求的模拟和验证。本文将介绍如何在 Spring 中进行集成测试,包括使用 Spring Test 模块和 MockMvc。

1. 引入必要的依赖

首先,在 pom.xml 文件中添加 Spring Test 依赖:

<dependencies><!-- Spring Test 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

2. Spring Test 模块

Spring Test 模块提供了对 Spring 应用的全面测试支持,可以用来进行单元测试、集成测试和端到端测试。@SpringBootTest 注解用于加载完整的应用上下文,@WebMvcTest 注解用于仅加载 Web 层相关的上下文。

示例:完整应用上下文测试

假设我们有一个简单的 Spring Boot 应用,包括 UserControllerUserService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user")public User getUser(@RequestParam String username) {return userService.getUserByUsername(username);}
}@Service
public class UserService {public User getUserByUsername(String username) {// 模拟获取用户return new User(username);}
}public class User {private String username;public User(String username) {this.username = username;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

我们可以使用 @SpringBootTest 注解进行完整应用上下文测试:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetUserByUsername() {User user = userService.getUserByUsername("john_doe");assertThat(user.getUsername()).isEqualTo("john_doe");}
}

3. 使用 MockMvc

MockMvc 是 Spring 提供的一个用于测试 Spring MVC 控制器的工具,能够模拟 HTTP 请求并验证响应。使用 @AutoConfigureMockMvc 注解可以自动配置 MockMvc。

示例:Web 层测试

我们可以使用 @WebMvcTest 注解和 MockMvc 工具进行 Web 层测试:

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.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import static org.mockito.BDDMockito.given;@WebMvcTest(UserController.class)
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testpublic void testGetUser() throws Exception {given(userService.getUserByUsername("john_doe")).willReturn(new User("john_doe"));mockMvc.perform(MockMvcRequestBuilders.get("/user").param("username", "john_doe")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.username").value("john_doe"));}
}

在上述测试中,我们使用 @WebMvcTest 注解仅加载 UserController,并通过 @MockBean 注解模拟 UserService 的行为。然后,使用 MockMvc 模拟 HTTP 请求,并验证响应状态和内容。

4. 综合示例

假设我们有一个更复杂的控制器和服务类:

@RestController
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("/product")public Product getProduct(@RequestParam Long id) {return productService.getProductById(id);}
}@Service
public class ProductService {public Product getProductById(Long id) {// 模拟获取产品return new Product(id, "Sample Product");}
}public class Product {private Long id;private String name;public Product(Long id, String name) {this.id = id;this.name = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

我们可以使用 @SpringBootTest 和 MockMvc 进行集成测试:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;@SpringBootTest
@AutoConfigureMockMvc
public class ProductControllerIntegrationTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetProduct() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/product").param("id", "1")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1)).andExpect(MockMvcResultMatchers.jsonPath("$.name").value("Sample Product"));}
}

结论

通过本文的介绍,我们了解了如何在 Spring 中进行集成测试。Spring Test 模块提供了全面的测试支持,而 MockMvc 则是测试 Spring MVC 控制器的利器。

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

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

相关文章

深入解析ROC曲线及其应用

深入解析ROC曲线及其应用 什么是ROC曲线&#xff1f; ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;&#xff0c;即受试者工作特征曲线&#xff0c;是一种用于评估分类模型性能的工具。它通过展示真阳性率&#xff08;TPR&#xff09;与假阳性率&…

免费制作GIF和实时网络监控工具

ScreenToGif 不允许你们还不知道的一款免费且实用好用的GIF动画制作工具软件。可以实时对区域窗口录制、编辑录制多功能模块&#xff0c;操作简单。 支持自定义增减重复帧数、调整循环播放次数、调整播放速度及删除重复帧。 支持对帧做二次编辑&#xff0c;可进行帧翻转、缩放…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署ComfyUI:功能最强大、模块化程度最高的Stable Diffusion图形用户界面和后台

目录 ComfyUI的特性介绍 开始安装 做点准备工作 在Conda虚拟环境中进行 依赖项的安装 运行 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&…

2.1 【入门篇】Cortex M芯片与内核

一,Cortex M芯片简介 Cortex M系列芯片是ARM公司设计的一系列微控制器(MCU),广泛用于嵌入式系统。Cortex M系列芯片主要分为以下几种型号,每种型号都有其独特的特点和应用场景: Cortex-M0和M0+: 特点:这是Cortex M系列中最基本、最低功耗的型号,设计简单,适合成本敏…

昇思训练营打卡第二十天(CycleGAN图像风格迁移互换)

CycleGAN&#xff08;循环生成对抗网络&#xff09;是一种生成对抗网络&#xff08;GAN&#xff09;&#xff0c;它能够在没有成对训练样本的情况下&#xff0c;将一种风格的图片转换成另一种风格。CycleGAN通常用于图像到图像的转换任务&#xff0c;比如将马的图片转换成斑马的…

PHP 高级过滤器

PHP 高级过滤器 PHP 是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。在处理用户输入和数据交互时,安全性是一个重要的考虑因素。PHP 提供了一套强大的过滤器扩展,用于验证和净化数据。本文将深入探讨 PHP 的高级过滤器功能,包括其使用方法、优势以及在开发中的…

从数字化营销与运营视角:看流量效果的数据分析

基于数据打通的“全链路”营销是当下的“时髦”&#xff0c;应用它的前提是什么&#xff1f;深度营销和运营的关键数据如何获得&#xff1f;如何利用数据进行更精准的营销投放&#xff1f;如何利用数据优化投放的效果&#xff1f;如何促进消费者的转化&#xff0c;以及激活留存…

Java中的多线程并发编程:深入探索与最佳实践

引言 在当今的高性能计算环境中&#xff0c;多线程并发编程成为了软件设计的核心。Java&#xff0c;作为一门成熟且广泛使用的语言&#xff0c;提供了强大的多线程支持。然而&#xff0c;高效地利用这一特性并非易事&#xff0c;它需要对线程的生命周期、同步机制、以及并发工…

IDEA启动tomcat之后控制台出现中文乱码问题

方法1&#xff1a; 第一步&#xff1a;file--setting--Editor--File Encodings 注意页面中全部改为UTF-8&#xff0c;然后apply再ok 第二步&#xff1a;Run--Edit Configuration&#xff0c;将VM options输入以下值&#xff1a; -Dfile.encodingUTF-8 还是一样先apply再ok …

bdeaver mysql忘记localhost密码修改密码添加用户

描述 bdeaver可以连接当前的localhost数据库&#xff0c;但不知道数据库密码是什么。用这个再建一个用户&#xff0c;用来连接数据库 解决 1、在当前的数据库localhost右键&#xff0c;创建-用户 设置这个用户&#xff0c;密码 加权限 2、连接 用新的账号密码去连接&#x…

千古雄文《渔樵问对》原文、译文、解析

邵雍《渔樵问对》&#xff1a;开悟奇文&#xff0c;揭示世界的终极意义 【邵雍《渔樵问对》&#xff1a;开悟奇文&#xff0c;揭示世界的终极意义】 邵雍&#xff08;1011年1月21日&#xff0d;1077年7月27日&#xff0c;宋真宗大中祥符四年十二月二十五日戌时生至神宗熙宁十…

华华给月月出题

题目链接 (a*b)^c (a^c)*(b^c)&#xff0c;我们将合数素数幂分解&#xff0c;然后我们只要处理每个素数的幂&#xff0c;就可以处理出所以合数的幂。 代码&#xff1a; #include<bits/stdc.h> using namespace std; using ll long long; #define fi first #define s…

代谢组数据分析一:代谢组数据准备

介绍 该数据集是来自于Zeybel 2022年发布的文章_Multiomics Analysis Reveals the Impact of Microbiota on Host Metabolism in Hepatic Steatosis_ [@zeybel2022multiomics],它包含了多种组学数据,如: 微生物组(粪便和口腔) 宿主人体学指标 宿主临床学指标 宿主血浆代谢…

SpringCloud Alibaba Sentinel网关流量控制实践总结

官网地址&#xff1a;https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html GitHub地址&#xff1a;GitHub Sentinel 网关限流 【1】概述 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API …

深圳航空x-s3-s4e逆向和顶象滑块动态替换问题

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护&#xff1a; 使用Docker搭建集群使用Hado…

「AIGC」大语言模型系列-Transformer详解

Transformer模型相对复杂,下面我将提供一个简化版的Transformer模型的Python代码示例,使用PyTorch库实现。这个示例将包括模型的基本结构,如编码器和解码器,自注意力机制,位置编码,以及前馈网络。 请注意,这个示例主要用于教学目的,可能不包括一些生产环境中所需的特性…

LeetCode 290. 单词规律

LeetCode 290. 单词规律 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba…

idea2024破解安装教程

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️下载安装 &a…

如何将Grammarly内嵌到word中(超简单!)

1、下载 安装包下载链接见文章结尾 官网的grammarly好像只能作为单独软件使用&#xff0c;无法内嵌到word中&#x1f9d0;&#x1f9d0;&#x1f9d0; 2、双击安装包&#xff08;安装之前把Office文件都关掉&#xff09; 3、安装完成&#xff0c;在桌面新建个word文件并打开 注…