使用 EasyMock+PowerMock 模拟静态方法时出现 java.lang.ExceptionInInitializerError

标签 java unit-testing static-methods powermock easymock

我正在尝试使用 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 注解中模拟静态方法。

在过去的 2 天里,我一直被这个问题困扰。请提出解决方案。

最佳答案

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

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

关于使用 EasyMock+PowerMock 模拟静态方法时出现 java.lang.ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679426/

相关文章:

java - NetBeans 中 Java EE 后端的 HTML5 前端

php - 获取父类中子类的名称(静态上下文)

Java 方法不正确且过于频繁地重复输出

java - JAX-WS Service.getPort 是否在每次调用时返回新端口?

java - 如何在 Android 中拥有多个服务实例

java - Spring MVC : Testing particular annotated method gets invoked

c# - 在 C# 代码文件中内联原始 XML

java - Java中如何使用静态扩展变量?

java - 使用 XMPP 服务器和 Google Cloud Messaging(或更新的 Firebase Cloud Messaging)推送通知的 Android 聊天应用程序

java - 混合容器/客户端模式下的 Arquillian 和 Selenium