如何用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
相关产品推荐
相关产品推荐

