2012-08-13 14 views
7

JOptionPane statik yöntemlerini taklit etmeye çalışıyorum ve Java.lang.VerifyError'da takılıyorum. PowerMock for Mockito'yu ve tüm bağımlılıklarını indirdiğim için tüm versiyonlar güncel.PowerMock ile statik sistem sınıfını taklit etmeye çalışmak VerifyError

Bir önceki soru için verilen yanıtı kullanamıyorum, sınıfı sarmak ve sargının alt sınıfını oluşturmak için - bu bizim uygulamanızın tamamında. Bu noktada PowerMock'a çok fazla zaman harcadım ve fest ile baştan başlamak istemiyorum.

Bu hatayı gidermenin bir yolu var mı? Talimatlarda hem "Harekete Geçen Statik Yöntemler" ve "Sistem Sınıfları Alay" ı denedim. Yaptığım her şey @RunWith (PowerMockRunner.class) ve @PrepareForTest (My.class) olduğu için daha uzağa gidemem.

Bunu, JPanel'i genişleten bir sınıfa yapılan herhangi bir başvuruyla ilgili bir soruna indirebileceğimi buldum. İşte sorunu yaratmak için minimum testtir (ı Jpanel Boffo uzayıp PrepareForTest ile aynı istisna ele verdik):

: Ben testi çalıştırmayı denediğinizde İşte
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(); 
    } 
} 

alıyorum istisna
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 adresine bakın. –

+0

Tüm iş parçacığını okudum - gördüğüm şey bir yanıt verilmeden önce, birisi konuyu başka bir konuya çevirdi. Burada bir cevap varsa, lütfen bana işaret edin. Bu, soruyu gördüğüm ama cevap vermediğim yerlerden biri. – orbfish

cevap

12

İşte benim bir meslektaşım bugün keşfedilmiş düzgün bir geçici çözüm/çözüm.

düzenleme: Sadece bu soruyu yeniden okuyun ve JOptionPane ile alay etmeye çalıştığınız için, bunun yardımcı olacağından emin değilim, ancak dışlama deseniyle oynayabilirsiniz.

+0

import org.powermock.core.classloader.annotations.PowerMockIgnore; Bunun için ithalattır. – k1eran

3

Aslında neden VerifyError'u attığına dair hiçbir fikrim yok, ancak sınıfı başlatmadan önce sahte bir LookAndFill'i ayarlayarak bunun üstesinden gelebilirsiniz. Sadece Test sınıfına ek açıklama @PowerMockIgnore("javax.swing.*") ekleyip PowerMock sistemi classloader sorunlu sınıfların yüklenmesini erteler:

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()); 
} 
İlgili konular