2010-08-16 4 views
19
disponibili

L'esecuzione del seguente test di unità genera l'eccezione: java.lang.IllegalStateException: non ultima chiamata su un finto disponibileEasyMock 3.0, classe beffardo getta java.lang.IllegalStateException: non ultima chiamata su un finto


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); 
    } 
} 

Non sono sicuro di cosa sto facendo male e non riesco a trovare nessun buon esempio sul web. Come si prende in giro una lezione usando EasyMock 3.0. Cosa c'è di sbagliato con il suddetto test unitario? Qualsiasi aiuto sarebbe molto apprezzato.

Il mio progetto prevede le seguenti dipendenze 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> 

risposta

10

tuo metodo di prova guarda bene, tranne che non è che hai preparato l'oggetto fittizio che avete creato. Questo deve essere fatto utilizzando

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

questo modo si prepara l'oggetto preso in giro in modo che sia quello che verrà utilizzato sulla gestione del JUnit. Nessun problema con le tue dipendenze pure.

Inoltre, non sembra che si chiami il metodo che si sta verificando unitamente qui. Di solito, il modo di scrivere un metodo di prova è scrivere un metodo JUnit, usando le librerie di simulazione (come EasyMock e PowerMock) SOLO quando ci sono oggetti esterni oltre il contesto del metodo di prova, e poi riproducendo tutti gli oggetti derisi (che prepara i mock per sostituire i veri oggetti business nel test). Successivamente, si chiama il metodo effettivo che si sta tentando di testare e si convalida la funzionalità utilizzando i metodi org.junit.Assert.assertXXX().

17

Il motivo di questa eccezione è che Thread#isAlive() è un metodo final, ma EasyMock non supporta la simulazione dei metodi finali. Quindi, la chiamata a questo metodo che appare all'interno di EasyMock.expect(...) non è vista come una "chiamata su un mock".

per deridere metodi finali si avrebbe bisogno di uno strumento diverso beffarda, come JMockit (che si sviluppano):

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

    assertTrue(mock.isAlive()); 
} 

L'API di scherno in realtà non richiedono che i metodi da beffeggiare sono specificati in modo esplicito, in il caso generale. La classe Thread è un po 'difficile, però.