wake-up-neo.net

Wie man eine Testmethode testet/testet, die ungültig ist, möglicherweise in Mockito

Ich bin auf ein Problem gestoßen und kann keine elegante Lösung finden.

Das Problem liegt also bei einem Schein des Selenium-Web-Treibers, und ich weiß nicht, wie ich void-Methoden testen sollte.

public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    Selenium.clickAndWait(); //a problematic delegating call to Selenium
}

Was ich also frage, ist, wie man eine solche Methode richtig testet, ein Test wäre für eine Ausnahme geworfen worden, aber wie genau kann man diese ungültige Methode testen, an die ich delegiere?

17
Jarek

Das folgende Codebeispiel aus dieser Mockito-Dokumentation zeigt, wie Sie eine void-Methode überlisten können:

doThrow(new RuntimeException()).when(mockedList).clear();

// following throws RuntimeException:
mockedList.clear();
31
hoipolloi
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
21

In den vorherigen Antworten wurde betont, dass bei jedem Anruf etwas unternommen werden sollte (möglicherweise eine Ausnahme). Auf diese Weise, wenn Sie Folgendes tun:

doThrow(new RuntimeException()).when(mockedList).clear();

und rufen Sie dann den Stubbed-Service (oder die Logik) auf:

mockedList.clear();

es wird eine Ausnahme generiert. Was ist, wenn Sie das ordnungsgemäße Funktionieren einer Methode testen möchten, schreiben Sie möglicherweise einen positiven Testfall. Das Verspotten einer ungültigen Rückgabemethode für einen solchen Fall könnte folgendermaßen erfolgen:

doNothing().when(mockedList).clear();

das bedeutet, dass Sie, da Sie die clear()-Methode für mockedList mock stubben, sicher sein können, dass diese Methode die Logik der Einheit nicht beeinflusst, und Sie können dennoch den Rest des Flusses überprüfen, ohne eine Ausnahme zu generieren.

10
Sourabh

Sie können auch verwenden:

  • Die Methode Mockito.verify (mock/spy) prüft, wie oft die Methode aufgerufen wurde.
  • Oder verwenden Sie das argument captor , um einige an die void-Methode übergebene Parameter anzuzeigen/zu überprüfen.
1
jakcam

In Java 8 kann dies etwas sauberer gemacht werden

doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

Der return null; ist wichtig, und ohne ihn schlägt das Kompilieren mit ziemlich dunklen Fehlern fehl, da es keine passende Überschreibung für doAnswer finden kann.

0
Tim B

Sie können eine Ausnahme für Ihren Methodenaufruf auslösen. Hier ein kleines Beispiel, wie Sie dies tun können: 

doThrow(new RuntimeException()).when(mockedList).clear();

dann rufen Sie die mockedList.clear(); Mocked-Methode auf und lösen eine Ausnahme aus.

Oder Sie können zählen, wie oft Ihre Methode aufgerufen wurde. Hier ein kleines Beispiel, wie Sie dies tun können:

verify(mockedList, times(1)).clear(); 
0