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

使用@RunWith(MockitoJUnitRunner.class)时如何Mock静态方法调用

解决方案

Mockito 3.4.0及以上版本已经原生支持静态方法Mock,无需切换到PowerMockRunner,完全兼容@RunWith(MockitoJUnitRunner.class)的使用场景,以下是两种可落地的实现方案:


方案1:使用Mockito原生静态Mock(推荐,需Mockito≥3.4.0)

步骤1:确认依赖版本

首先保证测试依赖的Mockito版本符合最低要求,Maven依赖配置示例:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version> <!-- 最低支持3.4.0,建议使用最新稳定版 -->
    <scope>test</scope>
</dependency>

Gradle依赖配置示例:

testImplementation 'org.mockito:mockito-core:4.11.0'

步骤2:编写测试逻辑

Mockito.mockStatic()是作用域绑定的,建议搭配try-with-resources使用,自动释放静态Mock避免影响其他测试用例,示例代码如下:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;

import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class YourServiceTest {

    @Test
    public void testYourBizMethod() {
        // 构造期望返回的Mock配置实例
        MosConfig mockConfig = new MosConfig();
        // 可按需给mockConfig设置测试需要的属性值
        
        // 开启MosConfigFactory类的静态Mock作用域
        try (MockedStatic<MosConfigFactory> mockedStatic = mockStatic(MosConfigFactory.class)) {
            // 定义静态方法调用的返回值
            mockedStatic.when(MosConfigFactory::getInstance).thenReturn(mockConfig);

            // 此处执行业务测试逻辑,代码内部调用MosConfigFactory.getInstance()会返回上面构造的mockConfig
            // yourService.doBizAction();
            
            // 可选:验证静态方法是否被调用了指定次数
            mockedStatic.verify(MosConfigFactory::getInstance);
        }
        // 出了try块后,静态方法自动恢复原有逻辑,不会污染其他测试用例
    }
}

注意:静态Mock默认是线程封闭的,仅在当前测试线程内生效,如果你的业务逻辑存在多线程调用静态方法的场景,需要在对应子线程内单独开启静态Mock作用域。


方案2:适配层封装(兼容Mockito<3.4.0的老版本)

如果无法升级Mockito版本,可以通过封装静态调用的方式绕开静态Mock的需求,不需要修改原有工具类逻辑,侵入性极低:

步骤1:新增静态调用适配层

// 业务代码新增适配层,仅做静态方法转发,无额外逻辑
@Component // 若使用Spring可直接注入,否则手动实例化也可
public class MosConfigProvider {
    public MosConfig getInstance() {
        return MosConfigFactory.getInstance();
    }
}

步骤2:替换业务代码调用

原有直接调用MosConfigFactory.getInstance()的位置,改为注入MosConfigProvider后调用mosConfigProvider.getInstance()。

步骤3:测试时Mock适配层即可

@RunWith(MockitoJUnitRunner.class)
public class YourServiceTest {
    @Mock
    private MosConfigProvider mosConfigProvider;
    @InjectMocks
    private YourService yourService;

    @Test
    public void testYourBizMethod() {
        MosConfig mockConfig = new MosConfig();
        when(mosConfigProvider.getInstance()).thenReturn(mockConfig);
        
        // 直接执行业务逻辑测试即可
        yourService.doBizAction();
    }
}

内容的提问来源于stack exchange,提问作者Peter Osta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:01