2016-07-30 127 views
2

我试图用EasyMock + PowerMock来嘲笑静态方法。如果我不嘲笑静态方法,那么我得到异常java.lang.ExceptionInInitializerError,但有一个不同的堆栈跟踪,这纯粹是由于我的代码文件,错误是显而易见的。但是,如果我使用EasyMock + PowerMock来嘲弄静态方法,则PowerMock.mockStaticNice(Classname.class)行会引发相同的异常,但会使用不同的堆栈跟踪。堆栈跟踪是:
当使用EasyMock + PowerMock嘲弄静态方法时发生java.lang.ExceptionInInitializerError

java.lang.ExceptionInInitializerError 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:348) 
     at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:386) 
     at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219) 
     at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
     at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317) 
     at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:175) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:114) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:88) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:79) 
     at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212) 
     at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163) 
     at org.powermock.api.easymock.PowerMock.mockStaticNice(PowerMock.java:331) 
     at PackageName(ClassName.java:125) 
............................ 



的线125是PowerMock.mockStaticNice(Classname.class)

我已经尝试这样的:
1)提到含有PrepareForTest静态方法类名({class1.class,class2.class,class3.class})
2)在@Before注释中模拟静态方法。

我被这个问题困住了最后2天。请提出解决方案。

+0

只是为了记录:你明白*静态*是一个异常,应该避免在良好的OO设计中出现?和惊喜:没有静态调用,不需要PowerMock。 – GhostCat

+0

我明白这一点。但是我只是编辑某人以前的代码,所以除了嘲弄静态方法之外,我没有任何其他选择。 – Siddharth

+0

那么,你可以**添加一个接口/包装类,并改变静态调用来使用该包装;但是当然;存在一定风险;在这种情况下,这可能是不值得的。从这个意义上说:我很少在这里看到真正的答案:“这就是你如何使它与powermock一起工作”;所以也许你最好把它发布到Powermock谷歌组:https://groups.google.com/forum/#!forum/powermock – GhostCat

回答

4

正如我从你的解释中了解到的,ExceptionInInitializerError是在静态初始化阶段抛出的?我已经做出了这样的结论,因为根据栈跟踪PowerMock.mockStaticNice(Classname.class)是类Classname正在加载的第一个地方。

在这种情况下,您必须使用@SuppressStaticInitializationFor( PackageName.ClassName`)。在PowerMock文档中可以找到更多的信息:Suppress Unwanted Behavior

+0

谢谢!我也试过,但只是在压制行中写了类名,没有包名。现在正在工作。 – Siddharth