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

Mockito 4.11.0如何Mock类静态方法且保留实例方法正常执行?

解决方案:Mock静态方法并保留其他实例方法正常执行

核心思路

Mockito 4.11.0支持静态方法Mock,通过mockStatic()创建静态Mock上下文,同时使用真实的ABC实例确保其他非静态方法正常执行,避免Mock整个实例导致其他方法失效。

步骤与代码示例

1. 目标类ABC(示例)

public class ABC {
    public static void staticOne() {
        // 原业务逻辑
    }

    public void method1() {
        staticOne();
        // method1自身的业务逻辑
    }

    public String method2() {
        return "原method2返回值";
    }
}

2. 测试用例实现

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

public class ABCTest {

    @Test
    void testMethod1_MockStaticOne_KeepOtherMethods() {
        // 初始化真实的ABC实例,确保method2等非静态方法执行原逻辑
        ABC realABCInstance = new ABC();

        // 使用try-with-resources自动管理静态Mock的生命周期,防止污染其他测试
        try (MockedStatic<ABC> mockedStaticABC = mockStatic(ABC.class)) {
            // Mock静态方法staticOne,指定替代原逻辑的行为(这里是啥都不做)
            mockedStaticABC.when(ABC::staticOne).doNothing();

            // 执行要测试的method1
            realABCInstance.method1();

            // 验证静态方法staticOne被调用了一次
            mockedStaticABC.verify(ABC::staticOne, times(1));
        }

        // 验证其他实例方法method2正常执行原逻辑
        assert realABCInstance.method2().equals("原method2返回值");
    }
}

关键注意事项

  • 静态Mock的生命周期:必须用try-with-resources包裹mockStatic()的返回值,静态Mock是全局生效的,用完自动关闭才能避免影响其他测试用例。
  • 使用真实实例:不能Mock ABC的实例,否则method2()等非静态方法也会被Mock,无法执行原逻辑。
  • void静态方法的Mock:对于无返回值的静态方法,用doNothing()替代原逻辑,也可以根据需求自定义行为(比如抛出异常)。

内容的提问来源于stack exchange,提问作者Ujef Malek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:41:12