2016-07-30 132 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