Mockito testet eine void-Methode und löst eine Ausnahme aus

Lesezeit: 3 Minuten

Benutzer-Avatar
edwardmlyte

Ich habe eine Methode mit a void Rückgabetyp. Es kann auch eine Reihe von Ausnahmen auslösen, daher möchte ich testen, ob diese Ausnahmen ausgelöst werden. Alle Versuche sind aus demselben Grund gescheitert:

Die Methode when(T) im Typ Stubber gilt nicht für die Argumente (void)

Irgendwelche Ideen, wie ich die Methode dazu bringen kann, eine bestimmte Ausnahme auszulösen?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));

  • Mögliches Duplikat von How to make mock to void methods with mockito

    – Willian

    24. Juli 2017 um 20:40 Uhr

Benutzer-Avatar
JB Niet

Die Klammern sind schlecht gesetzt.

Sie müssen verwenden:

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

und NICHT verwenden:

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Dies wird in erläutert die Dokumentation

  • @edwardmlyte Diese Mockito-Inkonsistenz ist einer der Gründe, zu denen ich gewechselt habe MoxieMocks

    – Mül

    20. Oktober 2014 um 17:37 Uhr

  • @clement beide können verwendet werden: docs.mockito.googlecode.com/hg/latest/org/mockito/…. Das Erstellen einer Ausnahme löst sie nicht aus.

    – JB Nizet

    23. Juli 2015 um 15:27 Uhr


  • @JB Nizet Ich stimme dir voll und ganz zu, aber wenn ich doThrow(new Exception()) anstelle von doThrow(Exception.class) schreibe, habe ich den folgenden Fehler, wenn ich meinen Test starte; Ausnahme com.company.project.exception.ElementNotFoundException erwartet, aber org.mockito.exceptions.base.MockitoException erhalten:

    – milde

    24. Juli 2015 um 8:21 Uhr


  • Stellen Sie eine weitere Frage mit dem zu testenden Code, dem Testcode und dem vollständigen Stack-Trace der Ausnahme.

    – JB Nizet

    24. Juli 2015 um 9:17 Uhr

  • doThrow(new Exception()).when(object).voidMethod(any());

    – Soumyajit Swain

    18. November 2016 um 6:38 Uhr

Benutzer-Avatar
Ondrej Burkert

Wenn Sie sich jemals gefragt haben, wie Sie das mit dem neuen BDD-Stil von Mockito machen können:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

Und für zukünftige Referenzen muss man möglicherweise eine Ausnahme auslösen und dann nichts tun:

willThrow(new Exception()).willDoNothing().given(mockedObject).methodReturningVoid(...));

  • Danke, dass du das hier gepostet hast; wenn die Methode einen Wert zurückgibt: Given(mockedObject.methodReturningAnObject()).willThrow(new Exception()); wenn die Methode nichts zurückgibt: willThrow(new Exception()).given(mockedObject).methodReturningVoid(…)); Erklärungsformular javadoc: “Stubbing voids erfordert einen anderen Ansatz als {@link Mockito#when(Object)} (oder BDDMockito.given), da der Compiler keine void-Methoden in Klammern mag …”

    – Wolf359

    17. Dezember 2018 um 7:55 Uhr


Benutzer-Avatar
Ayushi

Sie können etwas wie das Folgende versuchen:

 given(class.method()).willAnswer(invocation -> {
          throw new ExceptionClassName();
        });
    

In meinem Fall wollte ich eine explizite Ausnahme für einen Try-Block auslösen, mein Methodenblock war so etwas wie unten

     public boolean methodName(param) throws SomeException{
    
        try(FileOutputStream out = new FileOutputStream(param.getOutputFile())) {
          //some implementation
        } catch (IOException ioException) {
          throw new SomeException(ioException.getMessage());
        } catch (SomeException someException) {
          throw new SomeException (someException.getMessage());
        } catch (SomeOtherException someOtherException) {
          throw new SomeException (someOtherException.getMessage());
        }
        return true;
      }

Ich habe alle oben genannten Ausnahmen für die Sonarabdeckung wie unten beschrieben

   given(new FileOutputStream(fileInfo.getOutputFile())).willAnswer(invocation -> {
      throw new IOException();
    });
    Assertions.assertThrows(SomeException.class, () ->
    {
      ClassName.methodName(param);
    });

  • given(class.method()) gibt den gleichen Fehler. Dein methodName gibt einen booleschen Wert zurück, während OP explizit verlangte, dass es void zurückgibt

    – Christian Vincenzo Traina

    3. Juni um 12:42 Uhr


1361170cookie-checkMockito testet eine void-Methode und löst eine Ausnahme aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy