Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用EasyMock+;模拟静态方法时java.lang.ExceptionInInitializerRor;PowerMock_Java_Unit Testing_Static Methods_Powermock_Easymock - Fatal编程技术网

使用EasyMock+;模拟静态方法时java.lang.ExceptionInInitializerRor;PowerMock

使用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

我正在尝试使用EasyMock+PowerMock模拟静态方法。如果我不模拟静态方法,那么我会得到异常java.lang.ExceptionInInitializerError,但是有一个不同的堆栈跟踪,这完全是由于我的代码文件造成的,错误很明显。但是,如果我使用EasyMock+PowerMock模拟静态方法,那么PowerMock.mockStaticNice(Classname.class)行会抛出相同的异常,但堆栈跟踪不同。堆栈跟踪为:

 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谷歌小组发帖:谢谢!我将在谷歌集团发布这个疑问。添加包装类是不可能的,因为我不允许更改以前编写的代码。谢谢!我也试过了,但只是在抑制行中写了类名,没有包括包名。它正在工作。