Mockito 是一个广泛使用的 Java 单元测试框架,主要用于创建和管理 mock 对象。传统上,Mockito 处理实例方法的模拟非常方便,但在模拟静态方法时,通常会遇到一些挑战。幸运的是,从 Mockito 3.4.0 开始,Mockito 引入了对静态方法模拟的原生支持,简化了这个过程。
1. 引入 Mockito 依赖
在你的 Maven 项目中,你可以通过以下依赖来引入 Mockito。这里需要注意的是,模拟静态方法的功能是 Mockito 3.4.0 及更高版本才开始支持的。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.0.0</version> <!-- 请使用最新版本 -->
<scope>test</scope>
</dependency>
2. 模拟静态方法的基本用法
假设我们有一个工具类 MathUtil
,其中包含一个静态方法 add
。
public class MathUtil {
public static int add(int a, int b) {
return a + b;
}
}
我们需要测试一个使用了 MathUtil.add
的类:
public class Calculator {
public int addTwoNumbers(int a, int b) {
return MathUtil.add(a, b);
}
}
接下来我们将使用 Mockito 来模拟 MathUtil.add
方法。
3. 编写测试代码
我们将编写一个测试类,其中使用 Mockito 来模拟 MathUtil.add
。
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
public class CalculatorTest {
private Calculator calculator;
private MockedStatic<MathUtil> mockedStatic;
@BeforeEach
public void setUp() {
calculator = new Calculator();
mockedStatic = Mockito.mockStatic(MathUtil.class);
}
@Test
public void testAddTwoNumbers() {
// 模拟 MathUtil 加法方法
mockedStatic.when(() -> MathUtil.add(1, 2)).thenReturn(5);
int result = calculator.addTwoNumbers(1, 2);
// 验证结果
assertEquals(5, result);
// 验证静态方法被调用
mockedStatic.verify(() -> MathUtil.add(1, 2));
}
@Test
public void testAddTwoNumbersDifferentInputs() {
mockedStatic.when(() -> MathUtil.add(3, 4)).thenReturn(10);
int result = calculator.addTwoNumbers(3, 4);
assertEquals(10, result);
mockedStatic.verify(() -> MathUtil.add(3, 4));
}
@AfterEach
public void tearDown() {
mockedStatic.close(); // 关闭 mock
}
}
4. 代码解析
在上述代码中,我们首先定义了一个 CalculatorTest
测试类,并在 setUp
方法中初始化了 Calculator
实例以及 MockedStatic
对象,这个对象将帮助我们模拟静态方法。
在测试方法中,我们通过 mockedStatic.when(...)
语句来定义静态方法的行为。例如,当我们调用 MathUtil.add(1, 2)
时,我们将返回值设定为 5。然后,我们调用 calculator.addTwoNumbers(1, 2)
来验证这项功能,并通过 assertEquals
方法验证返回值是否符合预期。
最后,通过 mockedStatic.verify(...)
我们可以验证静态方法是否被正确调用,以确保测试的全面性。
5. 总结
Mockito 提供的模拟静态方法的功能,使得在 Java 中进行单元测试变得更加灵活和高效。在使用这一特性时,记得在 @AfterEach
注解标记的方法中关闭 MockedStatic
实例,以确保不会影响后续测试的执行。通过这种方式,我们可以清晰地定义并验证静态方法的行为,极大地提升了测试的可维护性和可靠性。