如何写java单元测试
单元测试的基本概念
单元测试是针对代码中最小可测试单元(如方法、类)的验证过程,通常使用框架如JUnit或TestNG。目的是确保每个独立模块的功能正确性。
选择测试框架
Java主流单元测试框架:
- JUnit 5:最新版本,支持注解驱动和扩展模型。
- TestNG:功能更丰富,支持多线程测试和分组。
推荐从JUnit 5开始,因其社区支持广泛且与IDE(如IntelliJ、Eclipse)深度集成。
配置依赖
Maven项目中添加JUnit 5依赖:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
编写测试类
测试类需满足以下规则:
- 类名通常以
Test结尾(如CalculatorTest)。 - 方法使用
@Test注解标记。
示例:测试一个加法方法:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3)); // 断言预期结果
}
}
常用断言方法
JUnit提供多种断言验证结果:
assertEquals(expected, actual):验证相等性。assertTrue(condition):验证条件为真。assertThrows(Exception.class, () -> {}):验证是否抛出异常。
测试生命周期注解
@BeforeEach:每个测试方法前执行(如初始化资源)。@AfterEach:每个测试方法后执行(如清理资源)。@BeforeAll/@AfterAll:整个测试类前后执行(静态方法)。
模拟依赖(Mocking)
使用Mockito模拟外部依赖(如数据库、API):
@Test
public void testUserService() {
UserRepository mockRepo = Mockito.mock(UserRepository.class);
Mockito.when(mockRepo.findById(1)).thenReturn(new User(1, "Alice"));
UserService service = new UserService(mockRepo);
assertEquals("Alice", service.getUserName(1));
}
测试覆盖率工具
使用JaCoCo或Clover生成覆盖率报告。Maven配置示例:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
最佳实践
- 测试命名清晰(如
shouldReturnNullWhenInputIsInvalid)。 - 避免测试逻辑过于复杂,每个测试只验证一个行为。
- 优先测试公共接口而非私有方法。
- 定期运行测试并修复失败的用例。






