Java单元测试与集成测试的区别
单元测试
单元测试针对代码的最小可测试单元(如方法或类)进行验证,通常隔离外部依赖(如数据库、网络服务)使用模拟对象(Mock)。
- 范围:单一方法或类
- 速度:执行快(毫秒级)
- 工具:JUnit、Mockito、TestNG
- 目的:验证代码逻辑的正确性
集成测试
集成测试验证多个模块或系统间的交互,涉及真实依赖(如数据库、API)。
- 范围:跨组件或系统
- 速度:执行较慢(秒级或分钟级)
- 工具:JUnit(结合Spring Test)、TestContainers
- 目的:确保组件协作正常
关键差异对比
| 维度 | 单元测试 | 集成测试 |
|---|---|---|
| 测试目标 | 内部逻辑 | 模块间交互 |
| 依赖处理 | 模拟(Mock) | 真实依赖 |
| 执行频率 | 高频(每次代码变更) | 低频(部署前或定期) |
| 反馈速度 | 即时 | 延迟 |
实际应用示例
单元测试代码片段(使用JUnit+Mockito)
@Test
public void testCalculateDiscount() {
PricingService service = mock(PricingService.class);
when(service.getBasePrice(any())).thenReturn(100.0);
OrderProcessor processor = new OrderProcessor(service);
assertEquals(90.0, processor.calculateDiscount("item1"));
}
集成测试代码片段(使用Spring Boot Test)
@SpringBootTest
public class OrderIntegrationTest {
@Autowired
private OrderRepository repository;
@Test
public void testOrderPersistence() {
Order order = new Order("item1", 1);
repository.save(order);
assertNotNull(repository.findById(order.getId()));
}
}
选择建议
- 优先覆盖单元测试(快速反馈基础逻辑)
- 关键流程补充集成测试(验证系统整体行为)
- 两者互补,共同保障代码质量