如何用Mockito Stub所有方法调用及在ClassA中Stub ClassB的System.currentTimeMillis()
如何Stub其他类中调用的静态系统方法(以System.currentTimeMillis()为例)
需求背景
需要在测试中Stub所有方法调用,包括其他类内部调用的系统/第三方方法,具体场景是:在ClassA的测试方法里,让ClassB调用System.currentTimeMillis()时返回指定的固定值。
解决方案说明
由于System是Java的final静态类,普通Mockito无法mock其静态方法,因此需要使用PowerMockito(Mockito的扩展库,支持mock静态、final、私有方法等)来实现。
步骤与代码示例
1. 必要依赖
确保项目中引入PowerMock与JUnit、Mockito的集成依赖(以Maven为例):
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency>
2. 测试类代码(ClassA)
import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({System.class, B.class}) public class ClassA { @Test public void timeTest() { // Mock System类的静态方法 PowerMockito.mockStatic(System.class); // 指定调用currentTimeMillis时返回固定值10L PowerMockito.when(System.currentTimeMillis()).thenReturn(10L); // 调用B类的静态方法,此时内部的System.currentTimeMillis()会返回10L B.testPowerMock(); } }
3. 被测试类代码(ClassB)
public class B { public static void testPowerMock() { // 这里的调用会被Stub,输出10L而非真实当前时间 System.out.println(System.currentTimeMillis()); } }
关键说明
@RunWith(PowerMockRunner.class):指定测试用PowerMock的运行器执行,否则无法处理静态类的mock逻辑@PrepareForTest({System.class, B.class}):告诉PowerMock需要对这两个类进行字节码修改,以便拦截静态方法调用PowerMockito.mockStatic(System.class):将System类的静态方法设置为可mock状态PowerMockito.when(...):定义静态方法调用的返回值规则
内容的提问来源于stack exchange,提问作者tamizh143
相关产品推荐
相关产品推荐

