使用EasyMock+;模拟静态方法时java.lang.ExceptionInInitializerRor;PowerMock
我正在尝试使用EasyMock+PowerMock模拟静态方法。如果我不模拟静态方法,那么我会得到异常java.lang.ExceptionInInitializerError,但是有一个不同的堆栈跟踪,这完全是由于我的代码文件造成的,错误很明显。但是,如果我使用EasyMock+PowerMock模拟静态方法,那么PowerMock.mockStaticNice(Classname.class)行会抛出相同的异常,但堆栈跟踪不同。堆栈跟踪为:使用EasyMock+;模拟静态方法时java.lang.ExceptionInInitializerRor;PowerMock,java,unit-testing,static-methods,powermock,easymock,Java,Unit Testing,Static Methods,Powermock,Easymock,我正在尝试使用EasyMock+PowerMock模拟静态方法。如果我不模拟静态方法,那么我会得到异常java.lang.ExceptionInInitializerError,但是有一个不同的堆栈跟踪,这完全是由于我的代码文件造成的,错误很明显。但是,如果我使用EasyMock+PowerMock模拟静态方法,那么PowerMock.mockStaticNice(Classname.class)行会抛出相同的异常,但堆栈跟踪不同。堆栈跟踪为: java.lang.ExceptionInIni
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注释中的模拟静态方法。
在过去的两天里,我一直被这个问题困扰着。请建议解决方案。正如我从您的解释中了解到的,
异常初始化错误是在类的静态初始化过程中抛出的?我得出了这样的结论,因为根据stacktrace,行PowerMock.mockStaticNice(Classname.class)
是类Classname
的第一个加载位置
在这种情况下,您必须使用@SuppressStaticInitializationFor(
PackageName.ClassName`)。您可以在PowerMock文档中找到更多信息:仅供记录:您知道静态是一种异常,在好的OO设计中应该避免这种异常吗?令人惊讶的是:没有静态调用,也不需要PowerMock。我理解这一点。但是我只是在编辑某人以前的代码,所以除了模拟静态方法之外,我没有任何选择;但当然;这有一定的风险;在这种情况下,这可能是不值得的努力。从这个意义上说:我很少看到这里的答案真的会说“这就是如何让它与powermock一起工作的”;因此,也许你最好在Powermock谷歌小组发帖:谢谢!我将在谷歌集团发布这个疑问。添加包装类是不可能的,因为我不允许更改以前编写的代码。谢谢!我也试过了,但只是在抑制行中写了类名,没有包括包名。它正在工作。