java - 在一个类中使用 Mockito spy 从另一个类调用静态方法

标签 java junit mocking mockito

尝试使用 Mockito 的 spy 功能进行我的 JUnit 测试。我原来有一个类:

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

    public sayHello() {
        Systems.out.println("Hello");
    }
}

我的测试类中的所有内容都可以在上面的类中使用 mockito spy 正常工作:

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

    a1.method1();
}

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

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

public class App2 { 
    public static void sayHello() {
        Systems.out.println("Hello");
    }
}

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

最佳答案

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

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

关于java - 在一个类中使用 Mockito spy 从另一个类调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43196314/

相关文章:

java - 解析 XML 文件中特定标签的内容 (Java)

java - 如何在音乐播放器中制作进度条?(gui)

java - 是否有隐式扩展到泛型类型的可空注释?

java - 如何在所有 JUnit 测试中集成 Spring Instrument javaagent

java - JUnit:我可以保留 spring 上下文的公共(public)部分吗?

c++ - 如何在 Google Mock 中使用可选参数模拟方法?

ARM STM32 的 Ceedling CMock 设置

java - NameNode没有启动start-all.sh

java - mockito - 伪造 addObserver

java - 模拟持久化类返回 IllegalArgumentException