2016-07-05 10 views
1

Ich möchte tun: überprüfen, ob error einmal mit bestimmten Argument aufgerufen wird, aber es ist mir egal, ob andere Methoden für die gleiche Schein aufgerufen werden.Überprüfen, ob keine Interaktionen mehr auf einer bestimmten Methode

Mit anderen Worten, ich möchte überprüfen, wie Fehler gemeldet werden, aber ich habe nichts dagegen, Debug und Info.

Wie kann ich es tun?

+0

Würde nicht nur 'verify (logger, mal (1)). Error (" Boo ");' do it? – dty

+0

@dty Es wird nicht fehlschlagen, wenn 'logger.error (" Baa ")' nicht kommentiert ist, aber ich möchte. – kan

+0

Sorry, habe das nicht verstanden. In diesem Fall sollten Sie sich den Matchers-Kurs ansehen. Sie können überprüfen, ob es einmal mit "Boo" aufgerufen wird und niemals wenn das Argument nicht gleich "Boo" ist. – dty

Antwort

1

Allgemein

Wenn Sie überprüfen möchten, dass Sie empfangen ive genau x Fehler aber über den Text in dem Fehler nicht kümmern:

verify(logger, times(x)).error(anyString()); 

Wenn Sie überprüfen möchten, dass Sie x Fehler insgesamt, und dass y sollte den Text foo und z sollte den Text haben bar erhalten:

verify(logger, times(x)).error(anyString()); 
verify(logger, times(y)).error("foo"); 
verify(logger, times(z)).error("bar"); 
// ... (potentially other cases) 

In Context

So zum Beispiel y ou zur Verfügung gestellt, wenn Sie nicht über den Fehlertext ist es egal, es würde wie folgt aussehen:

verify(logger, times(1)).error(anyString()); 

Wenn Sie über den Fehlertext ist es egal (IE: Sie wollen genau 1 „Boo“ und 1 Gesamtfehler):

Wie Jeff darauf hingewiesen hat, kann der count-Parameter vernachlässigt werden, wenn Sie nur genau ein Ereignis suchen.

1

times(1) ist das Standardverhalten für verify, also verify(logger).error("Boo"); sollte ausreichen. Mockito ist auf a philosophy of "nice mocks" entwickelt, die unerwartete Operationen ermöglichen, also wenn Sie daran festhalten, sollte es egal sein, ob es anders genannt wird.

Wenn Sie andere Anrufe überprüfen wollen, wie Sie in den Kommentaren aufgeführt sind, können Sie not und never verwenden:

verify(logger).error("Boo"); 
verify(logger, never()).error(not(eq("Boo"))); 

Oder bekommen nur alle Anrufe mit einem ArgumentCaptor zu bestätigen:

ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class); 
verify(logger).error(logCaptor.capture()); 
assertEquals("Boo", logCaptor.getValue()); 
+0

"nicht" ist nicht so gut Lösung im allgemeinen Fall. Stellen Sie sich vor, wenn 'error' mehrere Argumente hätte oder ich mehrere 'error'-Aufrufe verifizieren müsste. 'verify (logger, mal (howManyErrorsIExpect)). error (any() ...)' ist einfacher zu benutzen. – kan