2016-07-30 20 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 googleグループに投稿する方が良いかもしれません。https://groups.google.com/forum/#!forum/powermock – GhostCat

答えて

4

あなたの説明からわかるように、ExceptionInInitializerErrorはクラスの静的初期化中にスローされますか?私はそのような結論を下しました。スタックトレースによれば、PowerMock.mockStaticNice(Classname.class)という行はクラスClassnameがロードされている最初の場所です。

この場合、@SuppressStaticInitializationFor( PackageName.ClassName`を使用する必要があります)。詳細については、PowerMockのマニュアルを参照してください:Suppress Unwanted Behavior

+0

ありがとう!私もこれを試しましたが、抑制行にクラス名を書き、パッケージ名は含めませんでした。それは今働いている。 – Siddharth

関連する問題