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

单元测试指南

单元测试是软件开发中针对程序模块(最小单元)进行的正确性检验。在 Java 中,我们通常使用 JUnit 框架来编写和运行单元测试。以下是一个详细的指南:

1. 引入依赖

首先,需要在项目中引入 JUnit 的依赖。如果你使用 Maven,在 pom.xml 文件中添加:

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.0</version> <!-- 使用最新稳定版 --><scope>test</scope>
</dependency>

2. 创建被测类

假设我们有一个简单的字符串工具类:

public class StringUtils {// 反转字符串public static String reverse(String input) {if (input == null) {return null;}return new StringBuilder(input).reverse().toString();}// 判断字符串是否为空public static boolean isEmpty(String str) {return str == null || str.trim().isEmpty();}
}

3. 创建测试类

src/test/java 目录下创建对应的测试类:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;class StringUtilsTest {@Testvoid testReverse() {// 正常情况assertEquals("cba", StringUtils.reverse("abc"));// 空字符串assertEquals("", StringUtils.reverse(""));// null 值assertNull(StringUtils.reverse(null));}@Testvoid testIsEmpty() {assertTrue(StringUtils.isEmpty(null));    // nullassertTrue(StringUtils.isEmpty(""));      // 空字符串assertTrue(StringUtils.isEmpty("  "));   // 空白字符assertFalse(StringUtils.isEmpty("hello")); // 非空字符串}
}

4. 常用注解

  • @Test:标记方法为测试方法
  • @BeforeEach:每个测试方法执行
  • @AfterEach:每个测试方法执行
  • @BeforeAll:所有测试方法执行(静态方法)
  • @AfterAll:所有测试方法执行(静态方法)
  • @Disabled:禁用测试方法
@BeforeEach
void setup() {// 初始化测试资源
}@AfterEach
void teardown() {// 清理资源
}

5. 断言方法

  • assertEquals(expected, actual):验证相等
  • assertTrue(condition):验证为真
  • assertFalse(condition):验证为假
  • assertNull(object):验证为 null
  • assertNotNull(object):验证非 null
  • assertThrows(Exception.class, () -> {}):验证抛出异常

6. 参数化测试

使用 @ParameterizedTest 简化多数据测试:

@ParameterizedTest
@ValueSource(strings = {"", "  ", "test"})
void testIsEmptyWithParams(String input) {boolean expected = input == null || input.trim().isEmpty();assertEquals(expected, StringUtils.isEmpty(input));
}

7. Mockito 模拟依赖

当测试需要隔离外部依赖时,使用 Mockito:

@ExtendWith(MockitoExtension.class)
class OrderServiceTest {@Mockprivate PaymentGateway paymentGateway;@InjectMocksprivate OrderService orderService;@Testvoid testPlaceOrder() {// 设置模拟行为when(paymentGateway.process(anyDouble())).thenReturn(true);Order order = new Order(100.0);assertTrue(orderService.placeOrder(order));// 验证模拟调用verify(paymentGateway).process(100.0);}
}

8. 测试命名规范

建议使用 MethodName_StateUnderTest_ExpectedBehavior 模式:

@Test
void reverse_NullInput_ReturnsNull() {assertNull(StringUtils.reverse(null));
}

9. 测试覆盖率

使用 Jacoco 生成覆盖率报告(Maven 配置示例):

<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.10</version><executions><execution><goals><goal>prepare-agent</goal></goals></execution><execution><id>generate-report</id><phase>test</phase><goals><goal>report</goal></goals></execution></executions>
</plugin>

10. 最佳实践

  1. 测试代码保持与生产代码同等质量
  2. 每个测试方法只验证一个行为
  3. 使用 Given-When-Then 结构:
@Test
void shouldReturnNullWhenInputIsNull() {// GivenString input = null;// WhenString result = StringUtils.reverse(input);// ThenassertNull(result);
}
  1. 避免测试私有方法(通过公共方法间接测试)
  2. 定期运行测试(建议集成到 CI/CD 流程)
http://www.dtcms.com/a/597995.html

相关文章:

  • C++实现LBM模拟Couette流
  • 实时显示鼠标的坐标值,注意事件的(event)
  • Parasoft C/C++test单元测试如何发现内存泄漏问题
  • 网站制作团队百度优选官网
  • 义乌网站推广怎么创建公司网站
  • MyBatis 动态 SQL 语法
  • 医院慢病电话随访:AI 问血压→异常转医生,0 人工
  • 网站建设采购项目合同书python入门基础教程
  • ajxa实例操作
  • 金融监管制度问答助手项目学习笔记(三)----RAFT微调
  • 【Qt】RK3576配置Qt5、GStreamer
  • 做消费金融网站价格做网站要用到什么软件
  • 无锡餐饮网站建设网页升级未成年人自行离开
  • CANOE概念与应用
  • 800V超充与V2G时代,AN3V ASIC霍尔传感器如何守护电流安全?
  • 佛山新网站建设哪家好html5特效网站
  • 箱线图生成器
  • 上海网站建设模板站霸网络网页设计与网站开发经济可行性
  • kuboard报错etcd无法访问 etcd 容量 大于 2G 导致报错了 etcdserver: mvcc: database space exceeded
  • 网站导航规划自适应文章网站模板
  • linux 系统查看进程占用物理内存大小方法
  • Electron 快速入门手册
  • AI Agent 之 ReAct 范式:推理与行动的完美结合
  • 杭州绿城乐居建设管理有限公司网站如何网上查个人房产信息
  • ZED2i ROS消息
  • DNS主从服务
  • 怎样做网站3天赚100万wordpress静态页面找不到
  • 辽宁网站建设企业网站 内容 制作
  • 高频面试八股文用法篇(二十)微服务RPC
  • Electron 文件选择功能实战指南适配鸿蒙