easymock

EasyMock 3.0, la clase burlona lanza java.lang.IllegalStateException: no hay última llamada en un simulacro disponible



easymock verify (2)

El motivo de esta excepción es que Thread#isAlive() es un método final , pero EasyMock no admite la burla de los métodos finales. Por lo tanto, la llamada a este método que aparece dentro de EasyMock.expect(...) no se ve como una "llamada en un simulacro".

Para simular métodos finales, necesitarías una herramienta de simulación diferente, como JMockit (que yo desarrollo):

public void testMockingFinalMethod(@Mocked("isAlive") Thread mock) { new Expectations() {{ mock.isAlive(); result = true; }}; assertTrue(mock.isAlive()); }

La API de simulacros no requiere realmente que los métodos a imitar se especifiquen explícitamente, en el caso general. Sin embargo, la clase Thread es complicada.

La ejecución de la siguiente prueba unitaria arroja la excepción: java.lang.IllegalStateException: no hay última llamada en un simulacro disponible

import org.easymock.*; import org.junit.*; public class MyTest { @Test public void testWithClass() { Thread threadMock = EasyMock.createMock(Thread.class); EasyMock.expect(threadMock.isAlive()).andReturn(true); } }

No estoy seguro de lo que estoy haciendo mal y no puedo encontrar ningún buen ejemplo en la web. ¿Cómo te burlas de una clase usando EasyMock 3.0? ¿Qué está mal con la prueba de la unidad anterior? Cualquier ayuda sería muy apreciada.

Mi proyecto incluye las siguientes dependencias de maven.

<dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.0</version> <scope>test</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.2</version> <scope>test</scope> </dependency>


Su método de prueba se ve bien, excepto que no ha preparado el objeto simulado que ha creado. Esto tiene que ser hecho usando

EasyMock.replay(mockObject1, mockObject2, ...);

Esto preparará el objeto simulado de modo que sea el que se utilizará para ejecutar tu JUnit. No hay problemas con sus dependencias también.

Además, parece que no está llamando al método real que está probando aquí. Por lo general, la forma de escribir un método de prueba sería escribir un método JUnit, utilizando bibliotecas simuladas (como EasyMock y PowerMock) SOLAMENTE cuando haya objetos externos más allá del contexto del método de prueba, y luego volver a reproducir todos los objetos simulados (lo que prepara el simulacros para sustituir los objetos de negocio reales en la prueba). Después de eso, llama al método real que está intentando probar y valida la funcionalidad utilizando los métodos org.junit.Assert.assertXXX() .