Spring Boot Web 服务单元测试设计指南

2024年Java接口测试实战指南:从RestAssured到Testcontainers的完整框架搭建 接口测试是软件工程中验证系统组件间交互契约的核心实践,其原理在于通过模拟客户端请求来验证服务端API的响应、数据格式和性能是否符合预期。这一技术对于保障微服务架构下的系统稳定性和团队协作效率具有关键价值,广泛应用于持续集成、服务虚拟化和契约驱动开发等场景。在Java生态中,RestAssured凭借其声明式DSL成为RESTful API测试的事实标准,而Testcontainers则通过提供真实的、容器化的依赖环境,彻底改变了集成测试的范式。本文聚焦于如何将RestAssured与Testcontaine 阅读详情

在 Spring Boot Web 项目中,单元测试应聚焦单个组件的验证,隔离外部依赖(如数据库、网络服务)。以下是分层测试策略和最佳实践:

一、核心测试框架组合
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
二、分层单元测试策略

Service 层测试
使用 Mockito 模拟 Repository 依赖

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    
    @Mock
    private UserRepository userRepository;
    
    @InjectMocks
    private UserService userService;

    @Test
    void getUserById_WhenExists_ReturnsUser() {
        // 1. 准备 Mock 数据
        User mockUser = new User(1L, "test@example.com");
        when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));

        // 2. 执行测试
        User result = userService.getUserById(1L);

        // 3. 验证结果
        assertThat(result.getEmail()).isEqualTo("test@example.com");
        verify(userRepository).findById(1L); // 验证调用
    }

    @Test
    void getUserById_WhenNotExists_ThrowsException() {
        when(userRepository.findById(anyLong())).thenReturn(Optional.empty());
        
        assertThatThrownBy(() -> userService.getUserById(99L))
            .isInstanceOf(UserNotFoundException.class);
    }
}

Controller 层测试
使用 MockMvc 模拟 HTTP 请求

@WebMvcTest(UserController.class)
class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserService userService;

    @Test
    void getUser_ValidId_Returns200() throws Exception {
        User mockUser = new User(1L, "test@example.com");
        when(userService.getUserById(1L)).thenReturn(mockUser);

        mockMvc.perform(get("/api/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.email").value("test@example.com"));
    }

    @Test
    void createUser_InvalidInput_Returns400() throws Exception {
        String invalidJson = "{ \"email\": \"bad-email\" }";
        
        mockMvc.perform(post("/api/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content(invalidJson))
            .andExpect(status().isBadRequest());
    }
}

Repository 层测试
注意: 真实数据库交互属于集成测试。单元测试可使用内存数据库:

@DataJpaTest
class UserRepositoryTest {
    
    @Autowired
    private TestEntityManager entityManager;
    
    @Autowired
    private UserRepository userRepository;

    @Test
    void findByEmail_WhenExists_ReturnsUser() {
        // 1. 准备数据
        User savedUser = entityManager.persistFlushFind(
            new User(null, "test@example.com"));
        
        // 2. 执行查询
        Optional<User> result = userRepository.findByEmail("test@example.com");
        
        // 3. 验证结果
        assertThat(result).isPresent();
        assertThat(result.get().getId()).isNotNull();
    }
}
三、关键测试场景设计
层级测试场景验证要点
Service业务逻辑分支异常处理/事务边界/条件覆盖
Controller请求验证HTTP状态码/响应体/错误处理
Util纯逻辑组件算法正确性/边界条件
四、最佳实践
  1. 命名规范
    被测方法_测试条件_预期结果 模式

@Test
void transferFunds_InsufficientBalance_ThrowsException() { ... }

 测试隔离
使用 @BeforeEach 重置测试状态:

@BeforeEach
void setup() {
    reset(mockDependency); // 重置Mock状态
}

验证异常
JUnit 5 异常断言:

assertThrows(ValidationException.class, 
    () -> service.processRequest(invalidRequest));

参数化测试
覆盖多组输入:

@ParameterizedTest
@ValueSource(strings = {"2023-01-01", "2023-13-01", "invalid-date"})
void parseDate_InvalidInput_ThrowsException(String input) {
    assertThrows(DateTimeParseException.class, 
        () -> DateUtils.parse(input));
}
五、测试覆盖率优化
  • 使用 JaCoCo 检查覆盖率:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.8</version>
  <executions>
      <execution>
          <goals>
              <goal>prepare-agent</goal>
              <goal>report</goal>
          </goals>
      </execution>
  </executions>
</plugin>
  • 推荐目标:

    • 服务层:≥ 80%

    • 关键工具类:100%

    • Controller:验证核心状态码(非强制100%)

关键原则:单元测试应聚焦当前组件的责任,避免跨层验证。通过 Mock 隔离依赖,确保测试快速执行(单个测试类 < 1秒)。结合集成测试覆盖整体流程,形成完整的测试金字塔。

Spring Boot Test 系列4 - 深入探究使用WebTestClient作API测试 文章目录Spring Boot Test 系列4 - 深入探究使用WebTestClient作API测试前言API设计资源创建Controller类Case 1 - 查询全部用户编写测试运行测试-失败定义API运行测试-成功Case 2 - 创建新用户编写测试运行测试-失败定义POST方法运行测试-成功Case3 - 查询指定ID的用户编写测试运行测试-失败定义API运行测试-成功Case3 - 删除指定ID的用户编写测试运行测试-失败定义DELETE方法运行测试-成功单元测试小结集成测试驱动开发创建集成测 阅读详情

相关推荐

四路独立可控供电USB 2.0智能集线器设计

USB集线器是连接外设的基础接口设备,其供电管理能力直接影响系统可靠性与远程运维效率。传统HUB仅提供固定VBUS输出,缺乏端口级电源控制机制,难以实现软复位、故障隔离与功耗优化。本方案基于USB 2.0协议透明转发原理,通过硬件级电子负载开关(如MT9700)与独立MCU(ESP32-C3)协同,构建具备四路独立限流(680mA)、纳秒级通断响应、WiFi/MQTT远程管控能力的智能供电架构。技术价值体现在协议无侵入、控制域与数据域物理隔离、默认安全上电策略等工程实践要点,广泛适用于工业远程调试、实验室设

weixin_36289742的博客 193

【SpringBoot学习06】springboot测试及web环境模拟测试

文章目录1. 加载测试专用属性2. 加载测试专用配置3. Web环境模拟测试3.1 启动web测试3.2 测试类中发送请求3.3 响应状态匹配3.4 响应体匹配(json数据格式,开发中的主流)3.5 响应头匹配3.6 完整信息匹配4. 数据层测试数据回滚5. 测试用例数据设定 1. 加载测试专用属性 测试过程本身并不是一个复杂的过程,但是很多情况下测试时需要模拟一些线上情况,或者模拟一些特殊情况。但是在测试过程中,我们能不能每次测试的时候都去修改源码application.yml中的配置进行测试呢?显然是

一个正在努力学习的iter 5263

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1012

Web项目如何做单元测试

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

nhb687095的博客 248

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1118

从FreeCAD到BIMBase:PlaneGCS约束求解器的移植使用指南

本文为BIMBase平台的开发者提供了一份详细的PlaneGCS几何约束求解器移植与集成指南。文章深入探讨了如何从FreeCAD中提取PlaneGCS核心代码,并将其适配到BIMBase的C++二次开发环境中,重点解决了内存管理、数据模型桥接、约束抽象以及性能调优等关键问题,旨在帮助开发者构建稳定高效的参数化设计模块。

weixin_29213525的博客 320

SpringBoot测试及web环境模拟测试

目录一、加载测试专用属性1. 临时属性2. 临时参数二、加载测试专用配置三、Web环境模拟测试1. 启动web测试2. 测试类中发送请求3. 响应状态匹配4. 响应体匹配5. 响应头匹配6. 完整信息匹配四、数据层测试数据回滚五、测试用例数据设定 一、加载测试专用属性 在很多测试下需要模拟一些线上情况,或者模拟一些特殊情况。但是在测试过程中,我们能不能每次测试的时候都去修改源码application.yml中的配置进行测试呢?显然是不行的。每次测试前改过来,每次测试后改回去,这太麻烦了。于是我们就想,需要

qq_51938362的博客 2361

STM32F4驱动ES8388音频芯片的I²S时钟与DMA流设计

I²S(Inter-IC Sound)是一种广泛应用于嵌入式音频系统的同步串行总线协议,其核心在于精确的时钟同步与稳定的数据流传输。理解I²S时钟树结构(含MCLK、SCLK、WS生成逻辑)和分频机制,是保障CD级音质(如44.1kHz/16bit)的基础;而DMA双缓冲技术则解决了实时音频播放中数据供给连续性的关键工程问题。在STM32F4等Cortex-M4平台中,需协同配置PLLI2S锁相环、I²S预分频寄存器(I2SxPR)及DMA循环模式,同时兼顾ES8388等Codec芯片的I²C初始化时序与寄

weixin_35390379的博客 244

Spring Boot项目单元测试、热部署与原理分析(4.2)

在实际开发中,每当完成一个功能接口或业务方法的编写后,通常都会借助单元测试验证该功能是否正确。Spring Boot对项目的单元测试提供了很好的支持,在使用时,需要提前在项目的pom.xml文件中添加spring-boot-starter-test测试依赖启动器,可以通过相关注解实现单元测试。在开发过程中,通常会对一段业务代码不断地修改测试,在修改之后往往需要重启服务,有些服务需要加载很久才能启动成功,这种不必要的重复操作极大地降低了程序开发效率。

forget_wt的博客 410

Jetson Orin Nano Super开发板实战:视觉模型部署与性能优化指南

本文详细介绍了Jetson Orin Nano Super开发板在边缘AI视觉模型部署与性能优化的完整实战指南。内容涵盖JetPack 6.1环境配置、Docker容器化部署、YOLO11及Transformer模型的TensorRT优化技巧,并通过实测数据展示了性能提升与功耗管理策略,为开发者提供高效的视觉AI部署解决方案。

7h6j5k4l3的博客 1196

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3555

【开发篇】三、web下单元测试与mock数据

写懵了,刚开始竟然直接输出了一个new的Book对象,对象于Bean,前者不受Spring管控,也就是说Spring拿到随机数据也不能赋值给它,这个对象必须是Bean,所以改为了自动注入。平时写的测试Mapper和Service层方法的UT,就是一个普通的Java程序,没有web环境,想在web环境下启动,可以使用@SpringBootTest注解的。正常写UT时,这三个连一起就行,比如,先获取执行状态匹配器,再定义预期,然后做匹配。再响应头、响应结果…以上这个写法:比多环境开发中的测试环境影响范围更小,

llg___的博客 1056

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4492

⭐️Spring Boot单元测试

单元测试是软件开发过程中的一种测试方法,它关注于验证应用程序中最小的可测试部分——通常是单个函数、方法或类——的正确性。单元测试的目的是隔离代码的一部分并验证其行为是否符合预期。这些测试通常由开发者编写,并且是自动化的,可以频繁地运行以确保代码更改不会引入新的错误。自动化:可以由机器自动执行,无需人工干预。重复执行:在软件开发周期的不同阶段可以多次运行。快速反馈:能够迅速提供测试结果,帮助开发者理解代码更改的影响。独立性:每个测试应该独立于其他测试运行,不依赖于系统的其他部分或外部资源。

Python老吕的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Boot Test介绍

一、Spring Boot Test介绍 Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而Spring Boot Test 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力。 整体上,Spring Boot Test支持的测试种类,大致可以分为如下三类: 单元测试:一般面向方法,编写一般业务代码时,测试成本较大。涉及到的注解有@Test。 切片测试:一般面向难于测试的边界功能,介于单元测试和功能测试之间。涉及到的注解有@RunWith

qq_57756904的博客 5万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

单元测试、模块测试、web接口测试

然而在功能的实现代码中并没有“单元”,也没有“模块”;只有函数、类和方法。先来分别看看它们 的定义:单元测试(Unit testing),是指对软件中的最小可测试单元进行检查和验证。通常该代码块单独和孤立 的,如果您的测试使用了一些外部资源,如网络或数据库,它不是一个单元测试。单位测试应该是相当简单的写。一个单元测试基本上应该只是给出一些输入的功能,然后检查输出的功 能是正确的。在实践中,这可能会有所不同,因为如果你的代码是设计不良,编写单元测试可以是困难的。

nhb687096的博客 1937

spring boot单元测试

这些测试通常运行得很快,因为它们不依赖于整个Spring应用程序的上下文启动。光标定位到方法名称上,右键--》Run As --》JUnit Test。文件名改为HelloControllerTests。专注于测试Controller的逻辑。不需要启动整个服务器或数据库连接。

daqi1983的博客 1075

企业级Web项目中应该如何做单元测试、集成测试和功能测试?

先自我介绍下:本人有过10年测试经验,也参与过公安部网络安全产品测试交付、华为4G 网络设备测试交付、腾讯QQ空间APP产品测试交付。 关于“企业级Web项目中应该如何做单元测试、集成测试和功能测试”这个问题,我想给大家唠唠,我所知道的这方面知识。

测试界的彭于晏的博客 1739

SpringBoot实战(三十六)编写单元测试

SpringBoot实战(三十六)编写单元测试

ACGkaka的博客 2729

SpringBoot单元测试详解

转载   原文:https://www.codenong.com/cs106212170/ 文章目录一.Junit 测试二.集成测试1.Spring Boot 测试-测试其中的Bean2.Spring Boot Web 测试- 启动tomcat3.Spring Boot Web 测试- 不启动tomcat(模拟环境)三.单元测试1.web层测试2.mybtis mapper 测试3.测试任意的bean4.Mock操作四.相关注解的汇总五.参考网站 一.Junit 测试 当你的单元测试代码不需要用到 ..

三分恶的博客 2万+

springboot单元测试

文件中添加了Spring Boot Test相关的依赖。如果你使用的是Spring Initializr生成的项目,这些依赖通常已经包含在内。以上示例展示了如何在Spring Boot中使用Spring Boot Test模块进行单元测试。可以根据具体需求选择合适的注解和工具来编写测试用例。创建一个用于测试的类,并使用Spring Boot提供的注解进行配置。注解来加载Spring应用程序上下文,并使用。目录下,与被测试类相对应的包结构中。那么你可以创建一个测试类。例如,如果你有一个名为。

m0_56277423的博客 1577

SpringBoot——学会使用Test,检测自己写的代码_springboottest

这一篇总结了常用的代码测试的方法,去大厂真的是必不可少!希望小伙伴们都可以认真掌握,创作不易,喜欢的话,可以给博主三连支持哦~~

2501_90207129的博客 2097

SpringBoot Test详解

spring-boot-test项目:包含核心功能spring-boot-test-autoconfigure项目:支持自动配置通常情况下,我们通过spring-boot-starter-test的Starter来引入SpringBoot的核心支持项目以及单元测试项目以及单元测试库。JUnit:一个Java语言的单元测试框架:为SpringBoot应用提供集成测试和工具支持:支持流式断言的Java测试框架Hamcrest:一个匹配器库Mockito:一个Java Mock框架。

m0_74825238的博客 5345

Spring Boot 测试Web项目教程

Spring Boot 测试Web项目教程 1、项目的目录结构及介绍 gs-testing-web/ ├── complete/ │ ├── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── example/ │ │ │ │ ...

gitblog_00954的博客 545

Spring编写单元测试以及一些常用方式

Mockito 的官方文档提供了详细的说明和示例,帮助开发者更好地理解和使用 Mockito。以下是官方文档的链接:

okcross0的博客 493
上一篇: IntarkDB 使用总结
下一篇: R2DBC原理与应用前景
仰望星空@脚踏实地
博客等级 码龄19年 68粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值