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

如何用JUnit与Mockito测试调用外部类静态方法的Java方法

用Mockito测试Class A并验证Class B静态方法调用的方案

Mockito本身不支持直接mock静态方法,所以要验证B.staticMethod的调用参数,必须先重构代码结构,让依赖变得可测试。下面是具体实现步骤:

1. 重构代码,封装静态方法调用

新增一个BWrapper类,把对B.staticMethod的调用封装成实例方法,同时修改Class A,通过依赖这个Wrapper类来间接调用静态方法,这样就能用Mockito mock这个Wrapper实例。

重构后的代码:

class A {
    private final BWrapper bWrapper;

    // 供测试用的构造方法,注入Wrapper实例
    public A(BWrapper bWrapper) {
        this.bWrapper = bWrapper;
    }

    // 保留原有无参构造,兼容原有业务调用
    public A() {
        this.bWrapper = new BWrapper();
    }

    public void testMe(String arg1, String arg2) {
        int arg3 = getArg3(arg1);
        // 调用Wrapper的实例方法,替代直接调用静态方法
        bWrapper.callStaticMethod(arg1, arg2, arg3);
    }

    private int getArg3(String arg1) {
        // 原有业务逻辑,比如根据arg1计算arg3
        return Integer.parseInt(arg1);
    }
}

// 封装静态方法调用的Wrapper类
class BWrapper {
    public void callStaticMethod(String arg1, String arg2, int arg3) {
        B.staticMethod(arg1, arg2, arg3);
    }
}

// 原有Class B保持不变
class B {
    public static void staticMethod(String arg1, String arg2, int arg3) {
        // 原有业务逻辑
    }
}

2. 编写JUnit测试用例

用Mockito mockBWrapper,注入到Class A中,然后验证Wrapper方法的调用参数是否符合预期:

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

class ATest {
    @Test
    void testMe_verifiesBStaticMethodArgs() {
        // 创建BWrapper的mock实例
        BWrapper mockWrapper = Mockito.mock(BWrapper.class);
        // 创建A实例,注入mock的Wrapper
        A aInstance = new A(mockWrapper);

        // 测试用参数
        String testArg1 = "123";
        String testArg2 = "test";
        int expectedArg3 = 123; // 对应getArg3("123")的返回值

        // 如果需要固定getArg3的返回值,可以用spy部分mock A
        A spyA = Mockito.spy(aInstance);
        Mockito.doReturn(expectedArg3).when(spyA).getArg3(testArg1);

        // 调用待测试方法
        spyA.testMe(testArg1, testArg2);

        // 验证Wrapper的方法是否被传入预期参数调用
        Mockito.verify(mockWrapper).callStaticMethod(testArg1, testArg2, expectedArg3);
    }
}

方案说明

  • 这种重构方式不会影响原有业务代码的调用,因为Class A保留了无参构造,原有场景依然可以直接new A()使用。
  • 通过Wrapper类将静态方法调用转化为实例方法调用,符合Mockito的mock能力范围,从而实现参数验证。
  • 如果getArg3的逻辑是确定的,也可以直接计算出expectedArg3的值,无需使用spy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:30:46