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

75、单元测试-嵌套测试

75、单元测试-嵌套测试

**嵌套测试**是JUnit 5提供的一种功能,允许将测试类组织成层次结构,提升测试代码的可读性和可维护性。

### 什么是嵌套测试?

嵌套测试通过`@Nested`注解,将测试类定义为外部类的**内部类**,形成嵌套结构。每个嵌套类可以包含自己的测试方法,以及`@BeforeEach`、`@AfterEach`等生命周期方法。

### 优点

1. **逻辑分组**:将相关的测试用例按功能或状态分组,使代码结构更清晰。

2. **共享上下文**:内部类可以访问外部类的成员变量和方法,方便共享测试数据和设置。

3. **独立生命周期**:每个嵌套类可以有独立的初始化和清理方法,减少重复代码。

### 使用示例

```java

import org.junit.jupiter.api.*;

public class ShoppingCartTest {

    private ShoppingCart cart;

    @BeforeEach

    void init() {

        cart = new ShoppingCart();

    }

    @Nested

    @DisplayName("空购物车")

    class EmptyCart {

        @Test

        @DisplayName("总金额应为0")

        void totalPriceShouldBeZero() {

            assertEquals(0, cart.getTotalPrice());

        }

        @Test

        @DisplayName("移除商品应抛出异常")

        void removeItemShouldThrowException() {

            assertThrows(IllegalStateException.class, () -> cart.removeItem("apple"));

        }

    }

    @Nested

    @DisplayName("添加商品后")

    class WithItems {

        @BeforeEach

        void addItem() {

            cart.addItem("apple", 2);

            cart.addItem("banana", 3);

        }

        @Test

        @DisplayName("总金额应正确")

        void totalPriceShouldBeCorrect() {

            assertEquals(2 * 5 + 3 * 3, cart.getTotalPrice());

        }

        @Nested

        @DisplayName("移除商品")

        class AfterRemovingItem {

            @Test

            @DisplayName("移除存在的商品")

            void removeExistingItem() {

                cart.removeItem("apple");

                assertEquals(3, cart.getItemCount());

            }

            @Test

            @DisplayName("移除不存在的商品应抛出异常")

            void removeNonExistingItem() {

                assertThrows(IllegalArgumentException.class, () -> cart.removeItem("orange"));

            }

        }

    }

}

```

### 注意事项

- **非静态内部类**:`@Nested`类必须是非静态的,以便访问外部类的成员。

- **执行顺序**:嵌套测试的执行顺序是从外到内,但同层级的嵌套类之间顺序不确定。

- **嵌套层级**:建议嵌套层级不超过3层,过深的嵌套会降低代码可读性。

- **生命周期方法**:嵌套类可以有自己的`@BeforeEach`和`@AfterEach`方法,但不会继承外部类的这些方法。

### 适用场景

- **复杂对象的状态测试**:例如,购物车的空状态、添加商品状态、结算状态等。

- **分层测试逻辑**:将初始化、操作、验证等步骤分到不同的嵌套类中。

- **多配置组合测试**:测试不同配置下的对象行为。

通过合理使用嵌套测试,可以有效地组织和管理测试代码,提高单元测试的可读性和维护性。

http://www.xdnf.cn/news/14776.html

相关文章:

  • 揭开 Git 裸仓库的神秘面纱:`git clone --mirror` 详解与使用指南
  • Windows电脑数据恢复终极指南:从原理到实战
  • 《去哪儿网Redis高并发实战:从问题定位到架构升级》
  • redis如何使用IO多路复用
  • 黑马python(十三)
  • Windows11 无法发现局域网内设备解决方法
  • SQL Server基础语句4:数据定义
  • 【C++开发】CMake构建工具
  • VBA基础之对象
  • CentOS 7.9 系统安装 Percona XtraBackup(含 xtrabackup 和 innobackupex 工具)的详细步骤
  • 深入剖析Flink内存管理:架构、调优与实战指南
  • 如何仅用AI开发完整的小程序<4>—小程序页面创建与删除
  • Kafka动态配置深度解析
  • Azure Devops
  • JMeter API 并发性能测试计划JMX文件解析
  • Elasticsearch、Faiss、Milvus在向量索引实现上的核心差
  • Redis 8.0向量库 vs 传统向量数据库:大模型知识库开发选型全指南
  • 华为公布《鸿蒙编程语言白皮书》V1.0 版:解读适用场景
  • HarmonyOS NEXT端侧工程调用云侧能力实现业务功能
  • 跨个体预训练与轻量化Transformer在手势识别中的应用:Bioformer
  • 什么是跨域问题?后端如何解决跨域问题?
  • rent8_wechat-最常用出租屋管理系统-微信小程序
  • 计算机网络第九章——数据链路层《流量控制和可靠传输》
  • Web攻防-XSS跨站Cookie盗取数据包提交网络钓鱼BEEF项目XSS平台危害利用
  • 【分布式理论】读确认数与写确认数:分布式一致性的核心概念
  • 吴恩达:从斯坦福到 Coursera,他的深度学习布道之路
  • Solidity内部合约创建全解析:解锁Web3开发新姿势
  • Qt/C++应用:防御性编程完全指南
  • 车载电子电器架构 --- 电子电气架构设计方案
  • Android Studio 打 APK 包报错 Invalid keystore format 的解决方法