java.lang.ExceptionInInitializerError 使用 EasyMock+PowerMock 模拟静态方法时
java.lang.ExceptionInInitializerError when mocking static method using EasyMock+PowerMock
我正在尝试使用 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})
中提及包含静态方法的 class 名称
2) 在@Before 注解中模拟静态方法。
在过去的两天里,我一直被这个问题困扰。请提出解决方案。
根据您的解释,我了解到 ExceptionInInitializerError
是在 class 的静态初始化期间抛出的?我得出这样的结论,因为根据堆栈跟踪,行 PowerMock.mockStaticNice(Classname.class)
是第一个加载 class Classname
的地方。
在这种情况下,您必须使用 @SuppressStaticInitializationFor(
PackageName.ClassName`)。您可以在 PowerMock 文档中找到更多信息:Suppress Unwanted Behavior
我正在尝试使用 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})
中提及包含静态方法的 class 名称
2) 在@Before 注解中模拟静态方法。
在过去的两天里,我一直被这个问题困扰。请提出解决方案。
根据您的解释,我了解到 ExceptionInInitializerError
是在 class 的静态初始化期间抛出的?我得出这样的结论,因为根据堆栈跟踪,行 PowerMock.mockStaticNice(Classname.class)
是第一个加载 class Classname
的地方。
在这种情况下,您必须使用 @SuppressStaticInitializationFor(
PackageName.ClassName`)。您可以在 PowerMock 文档中找到更多信息:Suppress Unwanted Behavior