2012-01-24 13 views
7

Nel seguente esempio:Garantire metodi non deriso non sono chiamati in Mockito

Execution execution = mock(Execution.class); 
    when(execution.getLastQty()).thenReturn(1000.0); 
    when(execution.getLastPrice()).thenReturn(75.0); 

    order.onFillReceived(execution); 

    assertEquals(0, order.getLeavesQty(), 0); 

esecuzione ha molti altri metodi che non possano essere chiamati. Solo i due metodi che sono stati derisi dovrebbero essere usati all'interno di questo test e dovrebbero essere chiamati. Se vengono chiamati altri metodi, il test dovrebbe fallire.

Come dire a Mockito di fallire se vengono chiamati altri metodi?

+1

Perché vuoi? Se la classe 'Order' chiama altri metodi della classe' Execution', e non influenza l'esito del comportamento che stai testando, allora perché vuoi che il test fallisca? –

+0

In questo caso particolare ... diciamo che order.onFillReceived termina assegnando order.getLeavesQty in base al metodo da execution.getWrongQty(). Poiché getWrongQty restituirà il valore predefinito per quel metodo (0), l'asserzione funzionerà anche se getLeavesQty non viene impostato con il valore corretto. Ciò è dovuto al fatto che l'impostazione predefinita per valori errati corrisponde allo stesso valore asserito nel test. – user465342

+0

Non lo seguo abbastanza. Ma non sarebbe più pulito scegliere valori per il test che non possono facilmente accadere per caso? In modo che se il test passa, si sa che il calcolo è avvenuto correttamente. Se il test non dimostra che è stato calcolato il valore corretto (piuttosto che accidentalmente), metterei in dubbio il valore del test. –

risposta

8

Il documentation copre questo esplicitamente. Si desidera chiamare verifyNoMoreInteractions, sia dopo aver chiamato verify (come da documentazione) o

verify(execution).getLastQty(); 
verify(execution).getLastPrice(); 
verifyNoMoreInteractions(execution); 

o utilizzando ignoreStubs:

verifyNoMoreInteractions(ignoreStubs(execution)); 
+0

Aggiungendo questo non riesce il test lamentando che ... Nessuna interazione è desiderata qui. – user465342

+0

Il rovescio della medaglia ... se ignoreStubs viene utilizzato (disponibile in 1.9), il precedente funziona correttamente. Il codice effettivo è verifyNoMoreInteractions (ignoreStubs (execution)); – user465342

+0

@ user465342: Beh, dipende da cosa stavi cercando di fare. Non hai mostrato cosa fa 'onFillReceived' - sospetto che se invochi solo 'getLastQty()' e 'getLastPrice()' una volta ciascuno, allora quanto sopra potrebbe andare bene, credo. Ma sì, se vuoi trattarli come metodi di stub allora "ignoreStubs" sembra la giusta via da percorrere. –

0

si potrebbe provare il non metodo se che si adatta il caso d'uso:

ie

verify(execution, never()).someOtherMethod(); 
Problemi correlati