2011-06-20 14 views
5

Estoy luchando con EasyMock. He escrito dos clases pequeñas para ilustrar mi problema:¿Cómo me burlo de un método heredado de una clase abstracta con EasyMock?

public abstract class A { 
    private AtomicReference<Integer> id = new AtomicReference<Integer>(null); 
    public final int getId() { 
     return id.get(); 
    } 
    public final boolean setId(int id) { 
     return this.id.compareAndSet(null, id); 
    } 
} 

public class B extends A { 
} 

entonces me dedico a escribir un método de prueba de la siguiente manera:

public class EasyMockTester extends EasyMockSupport { 
    @Test 
    public void test() { 
     B b = EasyMock.createStrictMock(B.class); 
     EasyMock.expect(b.getId()).andReturn(100); 
     replayAll(); 
     int id = b.getId(); 
     System.out.println("The ID is: " + id); 
     verifyAll(); 
    } 
} 

El problema es que quiero EasyMock simplemente se burlan de una instancia de clase B (mi clase real no está vacía, sino que agrega más métodos a los métodos heredados de la clase abstracta). En lugar de eso, EasyMock en realidad entra en el código de la clase A y comienza a quejarse sobre una NullPointerException. ¿Cómo hago que EasyMock se burle de una clase que amplía una clase abstracta?

Cuando corro esta prueba me sale el siguiente traza Fallo:

java.lang.NullPointerException en com.my.project.package.tests.A.getId (A.java:9) en com.my.project.package.tests.EasyMockTester.test (EasyMockTester.java:11) en sun.reflect.NativeMethodAccessorImpl.invoke0 (nativo Método) en sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java : 39) en sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) en java.lang.reflect.Method.invoke (Method.java:597) en org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:44) en org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15) en org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:41) en org.junit.internal. runners.statements.InvokeMethod.evaluate (InvokeMethod.java:20) en org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored (BlockJUnit4ClassRunner.java:79) en org.junit.runner s.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:71) en org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:49) en org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:193) en org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:52) en org.junit.runners.ParentRunner.runChildren (ParentRunner.java:191) en org.junit.runners.ParentRunner .Acceso $ 000 (ParentRunner.java:42) en org.junit.runners.ParentRunner $ 2.Evaluar (ParentRunner.java:184) en org.junit.runners.ParentRunner.run (ParentRunner.java:236) en org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:49) en org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java: 390) en org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)

Oh sí, estoy usando Eclipse 3.6.2, JUnit 4.8. 2 y EasyMock 3.0.

EDITAR: Parece que PowerMock puede manejar métodos finales de burla heredados de las clases abstractas. http://code.google.com/p/powermock/wiki/MockFinal

Respuesta

6

Creo que no está relacionado con clases abstractas, etc. Es causado por el hecho de que EasyMock no puede burlarse de los métodos final. Del EasyMock documentation:

No se pueden burlar los métodos finales. Si se llama, su código normal se ejecutará

Por lo tanto, debe hacer que su método no sea definitivo, o utilizar algún otro método de prueba que no requiera burlarse de él.

+0

¡Eso fue rápido! :) Eliminé "final" pero luego recibí la siguiente impresión en la consola: "La ID es: 0". ¿Es posible que se devuelva un valor predeterminado de AtomicReference (0) en lugar de 100? – hvth

+0

@leverpulled: cuando extienda 'EasyMockSupport' necesita usar métodos de instancia para crear simulaciones en lugar de métodos estáticos de' EasyMock'. – axtavt

+0

¡Tienes razón! ¡Gracias! :) – hvth

Cuestiones relacionadas