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

时间:2015-04-03 18:00:29

标签: java unit-testing mockito powermock

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

@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
    ...
    ...
}

有没有办法将模拟对象传递给辅助类? PowerMockito.mockStatic返回void,而PowerMockito.mock不会模拟静态方法。所以我无法弄清楚如何将模拟对象传递给helper类getDetails()方法。

2 个答案:

答案 0 :(得分:2)

PowerMock并不具备您愿意实现的目标。还有另一个模拟框架,可以通过检测字节码来模拟几乎所有内容 - JMockit

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

答案 1 :(得分:0)

关于静态方法只是一个简单的注释 - 因为这种方法更难以存根,并且由于存根它们可能会影响其他测试,我建议为它们添加单元测试并依赖这些测试而不是尝试确保方法被称为。

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