You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:50:42