2010-08-16 14 views
19

Ejecución de la siguiente prueba de la unidad inicia la excepción: java.lang.IllegalStateException: no última llamada en un simulacro disponiblesEasyMock 3.0, clase burla lanza java.lang.IllegalStateException: no última llamada en un simulacro disponibles


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 con EasyMock 3.0? ¿Qué pasa con la prueba unitaria 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> 

Respuesta

10

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

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

Esto preparará el objeto burlado de manera que es el que se utilizará en el funcionamiento de su JUnit. No hay problemas con tus dependencias también.

Además, parece que no está llamando al método real que está realizando pruebas unitarias aquí. Por lo general, la forma de escribir un método de prueba sería escribir un método JUnit, utilizando las libretas de burlas (como EasyMock y PowerMock) SÓLO cuando hay objetos externos más allá del contexto del método de prueba, y luego reproducir todos los objetos simulados (lo que prepara los simulacros para sustituir los objetos comerciales 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().

17

El motivo de esta excepción es que Thread#isAlive() es un método , 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 una simulación".

burlarse métodos finales que se necesitan una herramienta de burla diferente, como JMockit (que desarrollo):

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

    assertTrue(mock.isAlive()); 
} 

La API de burla en realidad no requieren que los métodos que se burlaban se especifican explícitamente, en el caso general. Sin embargo, la clase Thread es complicada.

Cuestiones relacionadas