在一个类中使用 Mockito 间谍从另一个类调用静态方法

R.C*_*R.C 6 java junit mocking mockito

尝试将 Mockito 的 spy 函数用于我的 JUnit 测试。我最初有一个类:

public class App1 { 
    public String method1() {
        sayHello();
    }

    public sayHello() {
        Systems.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试课程中的所有内容都与上面课程的模拟间谍一起正常工作:

@Test(expected = IOException.class)
public void testMethod1Failure(){   
    App1 a1 = spy(App1);
    doThrow(IOException.class).when(a1).sayHello();

    a1.method1();
}
Run Code Online (Sandbox Code Playgroud)

但在那之后我不得不改变事情并将 sayHello() 方法带入另一个类以用作静态方法:

public class App1 { 
    public String method1() {
        App2.sayHello();
    }
}

public class App2 { 
    public static void sayHello() {
        Systems.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

在此更改之后,我原来的 JUnit 测试用例被破坏了,我不确定如何使用 Mockito 间谍来启动调用外部 App2 静态方法的 App1……有谁知道我该怎么做?提前致谢

Vin*_*Pro 6

Mockito 不支持模拟静态代码。以下是一些处理方法:

  • 按照此处的建议使用 PowerMockito 或类似框架:使用 Mockito 模拟静态方法
  • 重构将静态方法转换回实例方法的代码。正如您发现静态方法不容易进行单元测试。
  • 如果执行有问题的实际静态方法成本低廉,则只需调用它。

  • 从 Mockito v3.4.0 开始,您可以在没有 PowerMockito 的情况下模拟静态方法。例如,参见 https://www.baeldung.com/mockito-mock-static-methods (2认同)