Java 如何写 单测
如何编写 Java 单元测试
Java 单元测试通常使用 JUnit 框架,结合 Mockito 等工具进行模拟对象测试。以下是具体实现方法。
添加依赖
在 Maven 项目中,需要在 pom.xml 中添加 JUnit 和 Mockito 依赖:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.5.1</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();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}
常用断言方法
JUnit 提供多种断言方法验证结果:
assertEquals(expected, actual):验证相等性。assertTrue(condition):验证条件为真。assertNull(object):验证对象为null。assertThrows(exceptionType, executable):验证是否抛出异常。
使用 Mockito 模拟对象
对于依赖外部服务的类,可以用 Mockito 模拟依赖:
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
public class OrderServiceTest {
@Test
public void testPlaceOrder() {
PaymentService mockPayment = mock(PaymentService.class);
when(mockPayment.process(anyDouble())).thenReturn(true);
OrderService orderService = new OrderService(mockPayment);
boolean result = orderService.placeOrder(100.0);
assertTrue(result);
verify(mockPayment).process(100.0);
}
}
测试生命周期注解
JUnit 5 提供注解控制测试生命周期:
@BeforeEach:每个测试方法前执行。@AfterEach:每个测试方法后执行。@BeforeAll:所有测试方法前执行(静态方法)。@AfterAll:所有测试方法后执行(静态方法)。
示例:
public class LifecycleTest {
@BeforeAll
static void setupAll() {
System.out.println("初始化全局资源");
}
@BeforeEach
void setup() {
System.out.println("初始化测试资源");
}
@Test
void test1() {
System.out.println("执行测试1");
}
}
参数化测试
通过 @ParameterizedTest 实现多组数据测试:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testWithValueSource(int value) {
assertTrue(value > 0);
}
测试私有方法
通过反射测试私有方法:

Method method = MyClass.class.getDeclaredMethod("privateMethod");
method.setAccessible(true);
Object result = method.invoke(myClassInstance);
集成测试与单元测试
单元测试应聚焦单一逻辑,避免依赖数据库或网络。集成测试需结合 Spring Boot Test 等框架,但不在单元测试范畴内。






