SpringBoot篇 单元测试 理论篇

1.单元测试概念介绍

简单来说,单元测试是对软件中的最小可测试单元进行检查和验证。在 Java 中,单元测试的最小单元是类。Spring Boot 提供了 spring-boot-starter-test 依赖,包含了JUnit、Mockito、Hamcrest 等常用的测试框架1。,主要作用有以下几点:

1.1 重要性

  • 及时发现问题:能在开发过程中尽早发现代码中的错误,避免问题积累到后期更难解决。

  • 保障功能正常:确保每个小部分的功能都按预期工作,让整个应用更可靠。

  • 方便后续修改:有单元测试的情况下,修改代码时能快速知道是否破坏了原有功能,更放心地进行优化和重构。

1.2 常用注解

  • @SpringBootTest:用于加载Spring Boot应用的上下文环境,让测试类可以使用Spring容器中的各种组件,适合进行集成测试或需要完整应用上下文的测试场景。

  • @WebMvcTest:用于测试Spring MVC相关的控制器等组件,会自动配置MockMvc,方便对HTTP请求和响应进行模拟和验证,但不会加载完整的应用上下文,测试速度相对较快。

  • @DataJpaTest:专门用于测试JPA相关的数据访问层代码,会自动配置内存数据库和相关的JPA组件,方便对数据库操作进行测试,也不需要加载完整应用上下文。

1.3 测试方法

  • 使用Mock对象:对于一些依赖外部系统或复杂组件的部分,可以用Mockito等工具创建Mock对象来模拟其行为,使测试更独立、更稳定,不受外部因素影响。

  • 断言验证:通过断言来验证测试结果是否符合预期,比如使用AssertJ等断言库,可以更方便地检查变量值、对象状态等是否正确。

1.4 单元测试依赖

XML 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

2. 单元测试应该测试什么?

2.1 测试内容

业务实现的路径 决定了单元测试的内容,如图所示:

上图展示了一个简单的三层架构流程:

  1. 用户发出请求。

  2. 请求被发送到Controller(控制器)。

  3. Controller调用Service(服务层)处理核心业务逻辑。

  4. Service层调用Dao(数据访问层)进行数据库的CRUD操作。

  5. Dao层与数据库(DB)交互,完成数据的存取。

  6. 数据库操作完成后,结果逐层返回给用户。


2.2 测试要素

单元测试的关键三要素是:

  1. 单元:指的是要测试的最小代码部分,比如一个函数。

  2. 用例:是具体的测试场景,包括输入和预期结果。

  3. 边界情况:测试输入数据的极限情况,确保代码能正确处理。


2.3 测试阶段

这里我们使用一种常用的测试方法,称为"Given-When-Then"模式,它将测试过程分为三个主要阶段:

  1. Given(给定)

    • 这是测试的准备阶段。

    • 在这个阶段,你需要设定测试的初始条件或环境,比如创建必要的数据或配置。

  2. When(当)

    • 这是执行阶段。

    • 在这个阶段,你执行特定的操作或触发某个事件,比如点击按钮或调用函数。

  3. Then(那么)

    • 这是验证阶段。

    • 在这个阶段,你检查操作的结果是否符合预期,比如验证数据是否正确更新或界面是否显示正确。

这种模式帮助测试人员清晰地定义测试场景,确保测试的每个步骤都有明确的目的和预期结果。

相关推荐
Tony Bai13 分钟前
“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈:Go 的诞生、演进与未来
开发语言·后端·golang
serendipity_hky2 小时前
【SpringCloud | 第2篇】OpenFeign远程调用
java·后端·spring·spring cloud·openfeign
嘟嘟MD2 小时前
程序员副业 | 2025年11月复盘
后端·创业
SadSunset2 小时前
(15)抽象工厂模式(了解)
java·笔记·后端·spring·抽象工厂模式
汝生淮南吾在北2 小时前
SpringBoot+Vue养老院管理系统
vue.js·spring boot·后端·毕业设计·毕设
李慕婉学姐2 小时前
【开题答辩过程】以《基于springboot的地铁综合服务管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
期待のcode3 小时前
Springboot配置属性绑定
java·spring boot·后端
海上彼尚3 小时前
Go之路 - 6.go的指针
开发语言·后端·golang
LYFlied3 小时前
在AI时代,前端开发者如何构建全栈开发视野与核心竞争力
前端·人工智能·后端·ai·全栈
用户47949283569153 小时前
我只是给Typescript提个 typo PR,为什么还要签协议?
前端·后端·开源