2012-08-13 44 views
7

我想模拟JOptionPane静态方法,并坚持在Java.lang.VerifyError。所有版本都是最新版本,因为我刚刚下载了Mockito的PowerMock及其所有依赖项。试图用PowerMock模拟静态系统类给VerifyError

我不能使用上一个问题给出的答案来包装类和包装器的子类 - 这是遍布我们的应用程序。在这一点上,我已经投入了相当多的时间在PowerMock上,而且我不想重蹈覆辙。

有没有办法解决这个错误?我已经在说明中尝试了“嘲弄静态方法”和“嘲笑系统类”。我不能再走得更远,因为我所做的都是@RunWith(PowerMockRunner.class)和@PrepareForTest(My.class)。

我发现我可以减少这个任何引用扩展JPanel的类的问题。下面是一个最小测试创建问题(我已经得到了与PrepareForTest相同的异常上博福和JPanel中):

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 – 2012-08-13 23:46:11

+0

我读了整个主题 - 我看到的是,在给出答案之前,有人将主题改为另一个问题。如果在这里有答案,请指向我。这是我看到问题的许多地方之一,但不是答案。 – orbfish 2012-08-14 00:13:18

回答

12

这里是一个整洁的解决方法/解决方案,我的一个同事今天发现: 只是注释@PowerMockIgnore("javax.swing.*")添加到测试类和PowerMock将推迟问题的类的类加载器系统的装载。

编辑:只是重新读这个问题,因为你试图嘲笑JOptionPane本身我不知道这会有所帮助,但也许你可以玩排除模式。

+0

import org.powermock.core.classloader.annotations.PowerMockIgnore;对此是重要的。 – k1eran 2014-06-03 14:44:56

3

我不知道为什么它会抛出VerifyError,但是可以通过在实例化类之前预先设置一个虚拟的LookAndFill来克服它。

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()); 
} 
相关问题