2012-08-13 22 views
7

JOptionPane静的メソッドをモックしようとしていて、Java.lang.VerifyErrorでスタックしています。 PowerMock for Mockitoとそのすべての依存関係をダウンロードしたばかりなので、すべてのバージョンが最新です。PowerMockで静的システムクラスをモックしようとするとVerifyErrorが発生する

私は前の質問に対して与えられた答えを使用して、クラスをラップし、ラッパーをサブクラス化することはできません。これはすべてアプリケーションの上にあります。私はこの時点でPowerMockにかなりの時間を費やしてきましたが、フェスティバルでやり直したくありません。

このエラーを解決する方法はありますか?私は、指示に "Mocking Static Methods"と "Mocking System Classes"の両方を試しました。私は@RunWith(PowerMockRunner.class)と@PrepareForTest(My.class)のすべてを行っているので、私はもっと遠くに行くことはできません。

私はJPanelを拡張するクラスへの参照でこの問題を軽減できることがわかりました。ここで問題を作成するための最低限のテストでは、(私はBoffo上とJPanelの上PrepareForTestと同じ例外を得ている)である:ここでは

import javax.swing.JPanel; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
//@PrepareForTest(JPanel.class) 
@PrepareForTest(TestCase.Boffo.class) 
public class TestCase { 

    @SuppressWarnings("serial") 
    public static class Boffo extends JPanel {} 

    @Test 
    public void test() throws Exception { 
     new Boffo(); 
    } 
} 

は、私がテストを実行しようとすると、私が得る例外です:

java.lang.VerifyError: (class: javax/swing/plaf/metal/MetalLookAndFeel, method: getLayoutStyle signature:()Ljavax/swing/LayoutStyle;) Wrong return type in function 
    at javax.swing.UIManager.setLookAndFeel(Unknown Source) 
    at javax.swing.UIManager.initializeDefaultLAF(Unknown Source) 
    at javax.swing.UIManager.initialize(Unknown Source) 
    at javax.swing.UIManager.maybeInitialize(Unknown Source) 
    at javax.swing.UIManager.getUI(Unknown Source) 
    at javax.swing.JPanel.updateUI(Unknown Source) 
    at javax.swing.JPanel.<init>(Unknown Source) 
    at javax.swing.JPanel.<init>(Unknown Source) 
    at javax.swing.JPanel.<init>(Unknown Source) 
    at com.package.TestCase$Boffo.<init>(TestCase.java:17) 
    at com.package.TestCase.test(TestCase.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:209) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

https://groups.google.com/forum/?fromgroups#!topic/powermock/GgUjp6_x3GQ%5B1-25%5D –

+0

私はそのスレッド全体を読んでいます - 私が見たのは、回答が与えられる前に、誰かが件名を別の問題に変更しました。ここに答えがあるなら、私にそれを指摘してください。これは私が質問を見た多くの場所の一つですが、答えはありません。 – orbfish

答えて

12

ここでは私の同僚が今日発見きちんと回避策/解決策です。

編集:JOptionPane自体をモックしようとしているので、これは助けになるとは思えませんが、除外パターンで遊ぶことができます。

+0

import org.powermock.core.classloader.annotations.PowerMockIgnore;このためのインポートです。 – k1eran

3

なぜそれがVerifyErrorをスローするのか分かりませんが、クラスをインスタンス化する前に、あらかじめ偽のLookAndFillを設定することで克服できます。 ただ、テストクラスに注釈@PowerMockIgnore("javax.swing.*")を追加し、PowerMockは、システムクラスローダに問題のあるクラスのロードを延期します:

public static class FakeLookAndFill extends BasicLookAndFeel { 
    @Override 
    public String getName() { 
     return "FakeLookAndFill"; 
    } 

    @Override 
    public String getID() { 
     return "FakeLookAndFill"; 
    } 

    @Override 
    public String getDescription() { 
     return "FakeLookAndFill"; 
    } 

    @Override 
    public boolean isNativeLookAndFeel() { 
     return false; 
    } 

    @Override 
    public boolean isSupportedLookAndFeel() { 
     //note it returns true 
     return true; 
    } 
} 

@Before 
public void setUp() throws Exception { 
    UIManager.setLookAndFeel(new FakeLookAndFill()); 
} 
関連する問題