Domanda

Sto usando Mockito a dare una prova di unità in Java, e mi piacerebbe verificare che un certo metodo è il ultimo chiamato su un oggetto.

che sto facendo qualcosa di simile nel codice in prova:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();

Nel mio finto, non mi interessa circa l'ordine in cui modifico tutto sulla riga, ma è molto importante che I non cercare di fare qualcosa di più ad esso dopo che ho salvato esso. C'è un buon modo per fare questo?

Si noti che non sto cercando verifyNoMoreInteractions: essa non conferma che SaveToDatabase è l'ultima cosa che si chiama, e fallisce anche se chiamo nulla sulla riga che non esplicitamente Verifica. Mi piacerebbe essere in grado di dire qualcosa del tipo:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();

Se aiuta, sto passando a Mockito da un test JMock che ha fatto questo:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
È stato utile?

Soluzione

Credo che richiede più lavoro personalizzato.

verify(row, new LastCall()).saveToDatabase();

e quindi

public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
        List<Invocation> invocations = data.getAllInvocations();
        InvocationMatcher matcher = data.getWanted();
        Invocation invocation = invocations.get(invocations.size() - 1);
        if (!matcher.matches(invocation)) throw new MockitoException("...");
    }
}

Risposta precedente:

Hai ragione. verifyNoMoreInteractions è quello che ti serve.

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);

Altri suggerimenti

non al 100% in argomento, ma stavo solo cercando di trovare l'opposto di verifica, e questo è stato l'unico risultato rilevante, finisce che cercavo Mockito.verifyZeroInteractions (finto);

Solo in caso chiunque altro finisce qui alla ricerca di questo ...

Questa domanda mi ha portato a fare alcuni miglioramenti al Verifiche API JMockit (disponibile nella prossima release 0,983).

La soluzione mi è venuta consente di scrivere (in un metodo di prova):


    new VerificationsInOrder() {{
        unverifiedInvocations();
        row.saveToDababase();
    }};

... se desideri solo per verificare che un determinato metodo viene chiamato dopo tutto il resto. Per verificare accade prima tutte le altre invocazioni, è sufficiente spostare la chiamata verso l'alto. Questo vale in realtà a qualsiasi sequenza di invocazioni consecutive.

Se oltre alla verifica di cui sopra, anche voi volete verificare che alcuni altri metodi vengono chiamati in qualsiasi ordine, una seconda verifiche di blocco possono essere aggiunti alla prova (prima o dopo l'altro blocco , non importa):


    new Verifications() {{
        row.setSomething(value);
        row.setSomethingElse(anotherValue);
    }};

Anche se un po 'lungo a causa dell'uso di classi interne anonime, questa sintassi è semplice e flessibile; notare come la struttura si aggiunge alla prova ed evita la ripetizione di chiamate di metodo (come verify(...)). C'è di più ad esso che ho descritto qui (Hamcrest matchers, conta invocazione, ecc), e non è limitato alla verifica di metodi di istanza (metodi e costruttori statici possono essere derisi e verificati nello stesso modo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top