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
¡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
@leverpulled: cuando extienda 'EasyMockSupport' necesita usar métodos de instancia para crear simulaciones en lugar de métodos estáticos de' EasyMock'. – axtavt
¡Tienes razón! ¡Gracias! :) – hvth