2012-08-13 32 views
7

Estoy intentando burlarme de los métodos estáticos de JOptionPane, y estoy atrapado en Java.lang.VerifyError. Todas las versiones son actuales, ya que acabo de descargar PowerMock para Mockito y todas sus dependencias.Intentar simular clase del sistema estático con PowerMock da VerifyError

No puedo usar la respuesta dada para una pregunta anterior, para envolver la clase y la subclase del contenedor; esto es todo por nuestra aplicación. He invertido una gran cantidad de tiempo en PowerMock en este punto, y no quiero comenzar de nuevo con fest.

¿Hay alguna manera de resolver este error? Intenté tanto "Mocking Static Methods" como "Mocking System Classes" en las instrucciones. No puedo ir más lejos ya que todo lo que hice fue @RunWith (PowerMockRunner.class) y @PrepareForTest (My.class).

Descubrí que podría reducir esto a un problema con cualquier referencia a una clase que amplía JPanel. Aquí está una prueba mínima para crear el tema (que he recibido con la misma excepción PrepareForTest en Boffo y en 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(); 
    } 
} 

aquí es la excepción que tengo cuando trato de ejecutar la prueba:

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

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

+0

Leí todo el hilo: lo que vi fue que antes de dar una respuesta, alguien cambió el tema a otro problema. Si hay una respuesta aquí, indícamela. Este es uno de los muchos lugares donde vi la pregunta pero no una respuesta. – orbfish

Respuesta

12

Aquí es una solución/solución clara y simple que un colega mío descubrió hoy: Simplemente añadir la anotación @PowerMockIgnore("javax.swing.*") a la clase de prueba y PowerMock aplazará la carga de las clases problemáticas para el cargador de clases del sistema.

corregir: Solo vuelve a leer la pregunta y ya que está tratando de burlarse de JOptionPane en sí no estoy seguro de que esto ayude, pero tal vez pueda jugar con el patrón de exclusiones.

+0

import org.powermock.core.classloader.annotations.PowerMockIgnore; es la importación para esto. – k1eran

3

No tengo ni idea de por qué arroja VerifyError, pero puede solucionarlo configurando un LookAndFill falso antes de instanciar la clase.

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()); 
} 
Cuestiones relacionadas