Ho una classe Foo
che è SUT e una classe Bar
, che è il suo collaboratore. Foo
chiama run(List<Object> values)
su Bar
con "expectedList
" come argomento. Quindi, Foo
aggiungerà qualche altro elemento a questo List
in modo che il suo stato sarà diverso da quello che era al momento della chiamata run()
. Ecco il mio caso di test.Mockito può verificare i parametri in base ai loro valori al momento della chiamata del metodo?
@Test
public void testFoo() {
Bar collaborator = spy(new Bar());
Foo sut = new Foo(collaborator);
verify(collaborator).run(expectedList);
}
Si noti che il collaboratore è in realtà un oggetto spia piuttosto che un mock. Questo test fallirà perché anche se run()
è stato chiamato con un argomento uguale a expectedList
, è stato modificato da allora e il suo valore attuale non è più uguale a expectedList
. Tuttavia, questo è il modo in cui dovrebbe funzionare, quindi mi chiedo se c'è un modo per avere Mockito per memorizzare l'istantanea dei parametri quando viene chiamato un metodo e verificarli in base a questi valori piuttosto che ai valori più recenti.
Sì, David ha ragione. A causa del modo in cui l'API di Mockito è realizzata, non è possibile verificare più chiamate con lo stesso riferimento di argomento. EasyMock può farlo perché ha una fase di attesa prima che venga eseguito il codice di produzione. Ad ogni modo invece di una 'Answer' uso un' ArgurmentCaptor' e scrivo una o più asserzioni sullo stato finale di quella lista, cioè con FEST-Assert 'assertThat (captor.getValue()). Contains (" A "," B ") .contains (" T "," U ");' – Brice
@Brice - come funzionerebbe diversamente dall'approccio di Michael Wiles? –
Non lo è. È solo un modo diverso per raggiungere lo scopo del test. Perché la maggior parte delle volte non è necessario controllare gli argomenti intermedi, ma solo che alcune interazioni sono avvenute e il risultato finale.Anche se devo dire se Tom aveva dei requisiti specifici, ho deciso che questo non lo avrebbe aiutato, ma in questo caso avrei evitato oggetti mutabili nel mio codice di produzione. Sembra una messaggistica tra due collaboratori e i messaggi dovrebbero essere sempre immutabili. – Brice