Mockito. Verifica degli argomenti del metodo


220

Ho cercato su Google, ma non ho trovato nulla di rilevante. Ho qualcosa del genere:

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);

Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();

Ora, voglio verificare che mymethod(Object o), che è chiamato dentro runtestmethod(), è stato chiamato con l'Oggetto o, non un altro. Ma passo sempre il test, qualunque cosa abbia inserito nella verifica, ad esempio, con:

Mockito.verify(mock.mymethod(Mockito.eq(obj)));

o

Mockito.verify(mock.mymethod(Mockito.eq(null)));

o

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

Passo sempre il test. Come posso effettuare tale verifica (se possibile)?

Grazie.

Risposte:


337

Un'alternativa ArgumentMatcherè ArgumentCaptor.

Esempio ufficiale:

ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());

Un captor può anche essere definito usando l' annotazione @Captor :

@Captor ArgumentCaptor<Person> captor;
//... MockitoAnnotations.initMocks(this);
@Test public void test() {
    //...
    verify(mock).doSomething(captor.capture());
    assertEquals("John", captor.getValue().getName());
}

1
Grazie per il campione! Non l'ho mai usato. Sembra un po 'strano avere cose come captor nel codice, ma ha aiutato.
Artemis

1
Haha, non ho capito la domanda, ma la risposta mi ha aiutato molto. Grazie :-)
Marcus K.

13
Importante: Chiama verificate () / capture () dopo aver usato il mock. Pensavo che dovesse essere "installato" prima ...
Daniel Alder,

1
Grazie per questa risposta!
Jose Flavio Quispe Irrazábal,

Questa è un'ottima risposta !! Grazie mille!
Ulky Igor il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.