Java 测试:框架与工具(JUnit, TestNG, Mockito)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐