2011-02-10 3 views
5

Ho un oggetto che sto prendendo in giro con un JMockit NonStrictExcpection() nel metodo @Before/setUp() della mia classe di test in modo che restituisca il valore previsto per la normale esecuzione della mia classe sottoposta a test.Rimozione di aspettative precedentemente definite in JMockit

Questo va bene per tutti i miei metodi di prova, salvo per un singolo test in cui voglio testare il funzionamento non normale di questo codice.

Ho provato a creare una nuova aspettativa nel metodo di test, che ritenevo avrebbe annullato l'aspettativa nel metodo setUp, ma ho trovato che l'aspettativa nel metodo setUp sta sopprimendo la nuova aspettativa.

Quando rimuovo l'aspettativa di setUp, il metodo di test si comporta come previsto (ma tutti i miei altri test falliscono, naturalmente).

Come dovrei codificare la mia classe di test in modo da poter avere le aspettative correttamente definite per ogni test con la quantità minima di codice? (So che potrei copiare/incollare il codice di aspettativa in ogni metodo di prova, ma non voglio farlo se del tutto evitabile).

Il mio codice di prova simile a questa (nota, questo è psuedocodarlo sorta e non viene compilato, ma si ottiene l'idea):

public class TestClass{ 

    @Before 
    public void setUp(){ 

     // Here I define the normal behaviour of mockObject 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Everyting is OK!"; 
     }}; 

     // Other set up stuff... 

    } 

    // Other Tests... 

    /** 
    * This method tests that an error when calling 
    * mockObject.doSomething() is handled correctly. 
    */ 
    @Test(expected=Exception.class) 
    public void testMockObjectThrowsException(){ 

     // This Expectation is apparently ignored... 
     new NonStrictExpectations() {{ 
      mockObject.doSomething(); 
      result = "Something is wrong!"; 
     }}; 

     // Rest of test method... 

    } 
} 

risposta

5

Io di solito basta fare un metodo privato che restituisce un Expectations tipo:

private Expectations expectTheUnknown() 
{ 
    return new NonStrictExpectations() 
    {{ 
     ... expectations ... 
    }}; 
} 

E poi basta chiamare il metodo nei metodi di prova che hanno bisogno l'esatto aspettativa:

@Test public void testUknown() 
{ 
    expectTheUnknown(); 
    ... here goes the test ... 
} 
+0

Non sarebbe questo significa che è necessario richiamare manualmente expectTheUnknown() su ogni singolo metodo di prova? Inoltre, penso che restituire 'NonStrictExpectations' non sia davvero necessario. –

+0

@IbrahimArief È passato un po 'di tempo da quando ho scritto la risposta, ma AFAIR, il punto della domanda OP era che era necessario un controllo più dettagliato di quando veniva chiamato il metodo. Non credo che ci sia alcun dubbio sul fatto che questa soluzione sia un trucco, ma almeno funziona :) – Steen

+1

Oh funziona magnificamente, non ci sono dubbi. :) Stavo solo confermando la mia preoccupazione che non sembra esserci altro modo se non quello di diffondere la definizione expectTheUnknown() su ciascun metodo in Jmockit piuttosto che avere una sorta di aspettativa speciale che scavalca un caso più generale. –

0

È possibile utilizzare MockUp per test basati sullo stato. Definisci il Mockup che vuoi in ogni metodo di prova. Puoi chiamare il metodo tearDown di MockUp per rimuovere il mock alla fine di ogni test.

It is described here