如何写java单元测试
单元测试的基本概念
单元测试是对代码中最小可测试单元(通常是方法或类)的验证,确保其行为符合预期。Java中常用JUnit框架进行单元测试。
引入JUnit依赖
使用Maven或Gradle构建工具时,需在配置文件中添加JUnit依赖。以下是Maven的配置示例:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
创建测试类
测试类通常与被测类同名,后缀为Test,并放在src/test/java目录下。例如,测试Calculator类:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3));
}
}
常用断言方法
JUnit提供多种断言方法验证测试结果:
assertEquals(expected, actual):验证期望值与实际值相等。assertTrue(condition):验证条件为真。assertNull(object):验证对象为null。assertThrows(exceptionType, executable):验证代码抛出指定异常。
测试生命周期注解
@BeforeEach:在每个测试方法前执行,用于初始化。@AfterEach:在每个测试方法后执行,用于清理资源。@BeforeAll:在所有测试方法前执行(静态方法)。@AfterAll:在所有测试方法后执行(静态方法)。
模拟依赖对象
使用Mockito框架模拟外部依赖,避免测试受外部系统影响。示例:

import static org.mockito.Mockito.*;
@Test
public void testUserService() {
UserRepository mockRepo = mock(UserRepository.class);
when(mockRepo.findById(1)).thenReturn(new User(1, "Alice"));
UserService service = new UserService(mockRepo);
User user = service.getUser(1);
assertEquals("Alice", user.getName());
}
参数化测试
通过@ParameterizedTest实现多组输入测试:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
public void testIsPositive(int number) {
assertTrue(number > 0);
}
测试覆盖率
使用工具(如JaCoCo)统计代码覆盖率。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>
最佳实践
- 测试命名清晰,如
methodName_scenario_expectedResult。 - 避免测试依赖外部环境(数据库、网络等)。
- 优先测试核心逻辑,而非琐碎实现细节。
- 定期运行测试,确保代码变更后及时发现问题。






