将模拟的静态方法传递给另一个 class

Passing mocked static method to another class

我在测试 class 中使用 Powermock 模拟了一个 class 的静态方法。我面临的问题是这个静态方法在我的测试class中不是直接调用的,而是在其他一些class中调用的。这是骨架:

@Test public void myTest() { 
    PowerMockito.mockStatic(MyClassWithStaticMethod.class);
    PowerMockito.when(MyClassWithStaticMethod.staticMethod()).thenReturn("...");
    List<String> details = MyHelperClass.getDetails();
    ...
    ...
}

现在 MyHelperClass.getDetails 调用需要模拟的方法,因为它依赖于服务。

MyHelperClass.java

public static List<String> getDetails() {
    ...
    ...
    MyObj obj = MyClassWithStaticMethod.staticMethod(); //This needs to return mocked value
    ...
    ...
}

有没有办法将模拟对象传递给助手 class? PowerMockito.mockStatic returns void,其中 PowerMockito.mock 不模拟静态方法。所以我无法弄清楚如何将模拟对象传递给助手 class getDetails() 方法。

PowerMock 并不能真正实现您想要实现的目标。还有另一个模拟框架,它可以通过检测字节码来模拟几乎所有东西 - JMockit

至于你的问题 - 也许 that 会有所帮助

只是关于静态方法的简单说明 - 因为这种方法更难存根并且存根它们可能会影响其他测试,我建议为它们添加单元测试并依赖这些测试而不是试图确保该方法被调用。

我提倡这种方法的原因是静态方法应该只包含实用方法,这些方法一旦经过测试就可以依赖。而且检查方法调用总是会引入代码和单元测试之间的耦合,导致在考虑重构时令人头疼,因为应用程序代码重构会导致大量单元测试需要更改。