Java 测试:框架与工具概览
高质量的测试是 Java 开发中不可或缺的一部分。现代框架能够自动化代码检查,在早期阶段发现错误,并确保应用程序的稳定性。在本文中,我们将介绍 Java 中用于单元测试、模拟(mocking)和集成测试的关键工具,并提供实际使用示例。
1. JUnit 5 —— 单元测试的标准
JUnit 5 (Jupiter) 是 Java 中最流行的单元测试框架。它提供了用于定义测试方法、管理生命周期和参数化的注解。
JUnit 5 的主要注解:
@Test—— 标记测试方法@BeforeEach/@AfterEach—— 在每个测试之前/之后执行@BeforeAll/@AfterAll—— 在整个类中执行一次@ParameterizedTest—— 用于不同输入数据的测试
简单测试示例:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test void testAddition() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); }
@Test void testDivisionByZero() { Calculator calc = new Calculator(); assertThrows(ArithmeticException.class, () -> calc.divide(10, 0)); }}2. TestNG —— 功能更丰富的替代方案
TestNG(下一代测试)是另一个强大的框架,受 JUnit 启发,但提供了额外的功能:测试分组、依赖测试、并行执行以及通过 XML 进行灵活配置。
TestNG 的显著特点:
@Test(groups = {"smoke"})—— 测试分组@DataProvider—— 向测试传递数据@Test(dependsOnMethods = {"methodA"})—— 测试之间的依赖关系
使用 DataProvider 的示例:
import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import static org.testng.Assert.assertEquals;
public class DataDrivenTest {
@DataProvider(name = "testData") public Object[][] createData() { return new Object[][] { { 1, 2, 3 }, { 5, -3, 2 }, { 0, 0, 0 } }; }
@Test(dataProvider = "testData") public void testAdd(int a, int b, int expected) { Calculator calc = new Calculator(); assertEquals(calc.add(a, b), expected); }}3. Mockito —— 创建模拟对象(Mocks)
Mockito 是 Java 中用于创建模拟对象的库。它允许将待测试组件与其依赖项(数据库、外部服务)隔离,并检查对象之间的交互。
Mockito 的主要功能:
mock()—— 创建模拟对象when().thenReturn()—— 定义行为verify()—— 验证方法调用@Mock和@InjectMocks—— 自动注入模拟对象
Mockito 使用示例:
import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;
public class UserServiceTest {
@Test void testGetUser() { // 为仓库创建模拟对象 UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findById(1L)).thenReturn(new User("Alice"));
UserService service = new UserService(mockRepo); User user = service.getUser(1L);
assertEquals("Alice", user.getName()); verify(mock