Spesso lavoro con metodi che accettano callback e le richiamate sembrano essere difficili da testare. Consideriamo il seguente scenario, se esiste un metodo che accetta un callback con un singolo metodo (per semplicità suppongo che il metodo di test sia sincrono), il seguente testo può essere scritto solo per garantire che venga richiamato un metodo di callback:Test unità Java: il modo più semplice per verificare se viene richiamata una richiamata
@Test
public void testMethod() {
final boolean[] passed = {false};
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
passed[0] = isSuccessful;
}
});
assertTrue(passed[0]);
}
Sembra un surrogato. Mi piacerebbe sapere: c'è un modo più elegante per testare tale codice per far apparire il codice sopra simile allo pseudo-codice qui sotto?
@Test
public void testMethod() {
// nothing explicit here, implicit boolean state provided by a test-runner
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
if (isSuccessful) {
pass(); // not sure how it should look like:
// * an inherited method that sets the state to "true"
// * or an object with the pass method
// * whatever
// but doesn't exit testMethod(), just sets the state
}
}
});
// nothing explicit here too:
// test runner might check if the state is changed to true
// otherwise an AssertionError might be thrown at the end of the method implicitly
}
Un po 'più pulito. È possibile in JUnit, TestNG o in qualsiasi altro framework di test? Grazie!
UPDATE
dispiace, mi sembra di aver fatto una domanda vaga che in realtà non incontra quello che volevo chiedere. Fondamentalmente intendevo qualsiasi codice (non necessariamente un callback) che potrebbe essere invocato se determinate condizioni sono soddisfatte solo per impostare lo stato del risultato su true. In parole povere, voglio solo eliminare l'iniziale boolean[] passed
e l'assertTrue(passed[0])
finale assumendo che siano rispettivamente una sorta di prologo ed epilogo e assumendo che lo stato iniziale sia impostato su false
in modo che lo pass()
debba essere invocato per impostare lo stato su true
. passed[0]
è impostato su true
, non importa da dove proviene. Ma sfortunatamente ho fatto questa domanda usando il contesto dei callback, tuttavia questa è solo un'opzione, non un requisito. Quindi il titolo della domanda non riflette ciò che volevo veramente chiedere, ma prima dell'aggiornamento sono state pubblicate alcune risposte.
Grazie per la risposta! Sì, Mockito è un lib molto carino. Ad essere onesti, non ho preso in considerazione le librerie di derisione: volevo solo sbarazzarmi della bandiera surrogata e degli asserzioni finali. Con Mockito, anche 'verify' deve essere invocato correttamente. Ho solo pensato che l'ultima affermazione poteva essere implicita e "fornita" dal corridore di prova. –
Bene, come ho detto, è solo un valore corrispondente; se lo desideri, puoi sostituire l'argomento con 'true', o anche con un' ArgumentCaptor '. –
fge
Perché il downvote? – fge