Java如何单体测试
单体测试的基本概念
单体测试(Unit Testing)是针对代码中最小的可测试单元(如方法、类)进行的测试,目的是验证其功能是否符合预期。在Java中,通常使用JUnit或TestNG等框架实现。

编写测试用例
测试用例需覆盖正常逻辑、边界条件和异常情况。以JUnit 5为例:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
@Test
void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3)); // 正常逻辑
assertEquals(0, calculator.add(0, 0)); // 边界条件
}
}
测试隔离与Mock对象
依赖其他模块时,使用Mock工具(如Mockito)模拟依赖行为,避免真实调用影响测试结果。
import static org.mockito.Mockito.*;
@Test
void testUserService() {
UserRepository mockRepo = mock(UserRepository.class);
when(mockRepo.findById(1L)).thenReturn(new User(1L, "Alice"));
UserService service = new UserService(mockRepo);
assertEquals("Alice", service.getUserName(1L));
}
测试覆盖率与持续集成
通过工具(如JaCoCo)检查代码覆盖率,确保测试覆盖核心逻辑。在Maven/Gradle中集成测试任务:
<!-- 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>
常见测试模式
- 参数化测试:通过
@ParameterizedTest测试多组输入。 - 断言扩展:使用Hamcrest或AssertJ提供更灵活的断言。
- 测试生命周期:利用
@BeforeEach、@AfterEach初始化和清理资源。
测试最佳实践
- 测试命名清晰,如
methodName_scenario_expectedResult。 - 避免测试依赖外部资源(如数据库)。
- 定期运行测试,纳入CI/CD流程(如Jenkins、GitHub Actions)。





