2015-04-03 52 views
1

我在我的测试类中嘲笑了一个使用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不会模拟静态方法。所以我无法弄清楚如何将模拟对象传递给助手类getDetails()方法。

回答

1

PowerMock并不能真正满足你愿意实现的功能。 JMockit

至于你的问题 - - 还有另外一个嘲弄的框架,可以通过插装字节码嘲笑字面上几乎所有的东西也许that将有助于

+0

谢谢!起初我对使用JMockit犹豫不决,因为mockito已经被使用,我想通过使用PowerMock和mockito来找出解决方案。我碰到几个让JMockit运行的问题 - 必须将我的Junit升级到4.12,因为JMockit仅支持JUnit 4.5+(它是一个加号,但是我希望我们的代码中的Junit 4.4测试没有在4.12中不支持的东西)。但所有的麻烦都完全值得成为JMockit这样美丽的朋友! :) – Pankaj 2015-04-06 18:34:33

+0

欢迎:) – jdevelop 2015-04-06 20:31:08

+0

测试应该更容易用JMockit编写,但它应该也适用于PowerMock。我想知道OP是否忘了在测试课上使用'@ PrepareForTest'? – 2015-04-15 13:31:41

0

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

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