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

使用Mockito-inline 3.6.28如何Mock静态void方法?求参考示例

Mock静态void方法实现(适配Mockito-inline 3.6.28)

Mockito-inline 3.6.28 原生支持静态方法Mock,不需要引入PowerMock等额外依赖,静态void方法的Mock逻辑和有返回值的静态方法略有区别,以下是可直接运行的实现示例。


前置准备

确保项目中没有同时引入版本不一致的mockito-core依赖,mockito-inline与mockito-core版本必须完全对齐,避免出现Mock初始化失败的问题。

完整代码示例

首先给出包含静态void方法的测试目标类:

// 待测试的工具类,包含静态void方法
public class CommonStaticUtil {
    public static void processData(String bizId, Integer status) {
        // 真实逻辑包含外部RPC调用、数据库操作等测试时需要跳过的副作用逻辑
        System.out.println("真实方法被触发,业务ID:" + bizId);
        throw new UnsupportedOperationException("真实方法执行会抛出异常");
    }
}

对应的测试用例代码:

import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

public class StaticVoidMethodTest {

    @Test
    public void testMockStaticVoid() {
        // 开启静态类Mock,try-with-resources会在代码块执行结束后自动关闭Mock作用域,避免污染其他测试用例
        try (MockedStatic<CommonStaticUtil> staticMock = mockStatic(CommonStaticUtil.class)) {
            
            // 场景1:默认行为,Mock后静态void方法会直接跳过原逻辑,不执行任何操作
            // 执行下面的代码不会触发原方法的打印和异常
            CommonStaticUtil.processData("biz001", 1);

            // 场景2:自定义Mock逻辑,比如记录入参、抛出指定异常
            staticMock.when(() -> CommonStaticUtil.processData(anyString(), anyInt()))
                    .thenAnswer(invocation -> {
                        // 提取方法入参做自定义校验
                        String bizId = invocation.getArgument(0);
                        Integer status = invocation.getArgument(1);
                        System.out.println("Mock方法被调用,入参bizId:" + bizId + ",status:" + status);
                        
                        // 按需抛出指定异常,模拟方法执行失败场景
                        // throw new IllegalArgumentException("参数不合法");
                        return null; // void方法固定返回null即可
                    });

            // 场景3:指定静态void方法执行真实逻辑
            // staticMock.when(() -> CommonStaticUtil.processData(anyString(), anyInt()))
            //         .thenCallRealMethod();

            // 执行业务测试逻辑
            CommonStaticUtil.processData("biz002", 2);

            // 验证方法调用行为
            // 验证方法总共被调用2次(场景1调用1次,业务逻辑调用1次)
            staticMock.verify(() -> CommonStaticUtil.processData(anyString(), anyInt()), times(2));
            // 验证指定入参的调用是否存在
            staticMock.verify(() -> CommonStaticUtil.processData("biz001", 1), times(1));
        }
    }
}

常见踩坑说明

  • 不要套用普通实例void方法的doNothing().when(obj)写法,静态void方法必须放在MockedStatic实例的when()方法入参lambda中,否则会直接触发真实方法执行。
  • 必须用try-with-resources包裹MockedStatic实例,不要手动在@BeforeEach/@AfterEach中手动开关静态Mock,很容易因为异常导致Mock未关闭,污染其他测试用例。
  • 3.6.28版本默认不支持Mock JDK核心类(比如System.currentTimeMillis、LocalDateTime.now等),如果需要Mock这类方法要额外添加JVM启动参数,业务自定义类、第三方依赖类的静态void方法都可以正常Mock。

内容的提问来源于stack exchange,提问作者Ayush Maheshwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:24:19