2010-09-14 5 views

risposta

0

sono riuscito a trovare una soluzione:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}); 
+0

Per me non funziona. Dice "previsto: 1, effettivo: 0". – Vic

+1

Concordato che questo non funziona. La risposta corretta è di David Nguyen. – dhaag23

1

Sembra un bug per me. La classe interna Range non consente di impostare un valore massimo inferiore a 1.

Non si può prendere in giro tale metodo e chiamare semplicemente Assert.fail()?

+0

sì, alla fine l'ho fatto in quel modo, vedere la mia risposta – nkr1pt

1

Se vi aspettate il vostro metodo non per essere chiamato, allora proprio non registrarlo. Ma sono d'accordo che non funzionerà con un bel finto.

8

con EasyMock 3.0, è necessario aggiungere un .anyTimes() sul expectLastCall o il test avrà esito negativo:

Expectation failure on verify: myMethod(): expected: 1, actual: 0` 

sulla base di esempio nkr1pt:

expectLastCall().andAnswer(new IAnswer() { 
    public Object answer() { 
     Assert.assertFail(); 
     return null; 
    } 
}).anyTimes(); 
+3

Penso: Assert.assertFail(); dovrebbe essere solo: Assert.fail(); – Matt

+1

Mentre questa è una risposta funzionante, mi piace quella di David Wallace meglio poiché è meno prolissa. – qben

7

Il fatto che qualche metodo non è chiamato è controllato da Mock o StrictMock. Lanciano un'eccezione, quando viene chiamato quel metodo non registrato. Questo problema si verifica solo quando si utilizza NiceMock s, dove vengono restituiti i valori predefiniti quando si chiama per metodi non registrati.

Quindi una soluzione può essere non utilizzare NiceMock s.

+2

Sono fortemente in disaccordo con la conclusione. Forse, in questo caso, il bel finto non è la scelta migliore. Ma se vuoi essere sicuro che un metodo non venga chiamato, in effetti questa è l'unica cosa che vuoi testare, è meglio enfatizzare questo aspetto con un metodo mocked che fallisce con un messaggio appropriato. – qben

+1

È una buona argomentazione. Volevo segnalare questo, poiché mi sono imbattuto in perché non posso specificare 'times (0)'. E solo più tardi mi sono reso conto che quel tipo di contraddizioni con l'idea di una bella beffa, e non un bel scherzo, non permettono di eseguire metodi non registrati. Lanciare un'eccezione di assert come la risposta sembrava più una soluzione per me e che le chiamate al metodo 0 dovrebbero essere specificate usando mazzi non piacevoli. Forse sono un po 'assertivo nella conclusione. Lo correggerò e basta. – Vic

16

È possibile utilizzare .andThrow(new AssertionFailedError()).anyTimes(); - questa è la stessa eccezione che genera Assert.fail(), ma è meno dettagliata di un Answer.

+2

Forse aggiungendo una buona descrizione sul perché il test fallito migliora ulteriormente questa soluzione (che è la migliore di tutte dato qui IMO). – qben