Wie kann ich simulieren Sie eine statische Methode, die void zurückgibt mit PowerMock?
Ich habe ein paar statische util-Methoden in meinem Projekt, einige von Ihnen nur übergeben oder werfen eine Ausnahme. Es gibt eine Menge Beispiele gibt, wie mock eine statische Methode, die einen Rückgabetyp andere als nichtig. Aber wie kann ich simulieren Sie eine statische Methode, die void zurückgibt, um nur "doNothing()
"?
Nicht-void-version verwendet diesen Zeilen des codes:
@PrepareForTest(StaticResource.class)
...
PowerMockito.mockStatic(StaticResource.class);
...
Mockito.when(StaticResource.getResource("string")).thenReturn("string");
Aber, wenn angewendet, um eine StaticResources
zurückgibt void
die Kompilierung wird sich beschweren, dass when(T)
gilt nicht für leere...
Irgendwelche Ideen?
Workaround wäre wahrscheinlich nur noch alle statischen Methoden zurück, einige Boolean
für den Erfolg, aber ich mag nicht Problemumgehungen.
InformationsquelleAutor Pete | 2012-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie es tun, die gleiche Weise tun Sie es mit Mockito auf realen Instanzen. Zum Beispiel können Sie die Kette stubs, die folgende Zeile wird der erste Anruf nichts tun, dann den zweiten und Zukunft Aufruf
getResources
werfen eine Ausnahme :Dank einer Bemerkung von Matt Lachman, beachten Sie, dass wenn die default-Antwort nicht verändert mock Zeitpunkt der Erstellung, der mock wird nichts tun, standardmäßig. Damit schreiben Sie den folgenden code entspricht nicht, es zu schreiben.
Aber, dass gesagt wird, es kann interessant sein, für die Kollegen, Lesen Sie die Tests, die Sie erwarten nichts für diesen bestimmten code. Dies kann natürlich angepasst werden, je nachdem, wie wahrgenommen wird Verständlichkeit der test.
Durch die Art und Weise, meiner bescheidenen Meinung nach sollten Sie vermeiden, Spott statische code, wenn Sie Ihre neue crafting-code. Bei Mockito wir denken, es ist in der Regel ein Hinweis auf schlechtes design, führt zu schlecht wartbaren code. Obwohl bestehende legacy-code ist noch eine andere Geschichte.
Generell, wenn Sie brauchen, um mock private oder statische Methode ist, dann ist diese Methode nicht zu viel und sollte ausgelagert " in ein Objekt eingefügt werden, wird in das geprüfte Objekt.
Hoffe, das hilft.
Hinsichtlich
StaticResource cannot be resolved to a variable
)Oh ja sorry, du hast Recht mein code ist falsch, ich bin acustomed auf nicht statische verspottet. Jedenfalls habe ich aktualisiert meine ansswer entsprechend die richtige syntax.
Danke! Also mit statischen Hilfsmethoden, die keine Abhängigkeiten haben, ist eine schlechte Idee? Natürlich könnte ich einfach Spritzen und Objekt, die die Arbeit, aber es fühlt sich an wie es sinnvoll, Arbeitnehmer, die keine Abhängigkeiten haben, die in ein statisches Objekt, um zu bestätigen Ihre Unabhängigkeit..
Was ich meinte ist, wenn Sie Ihre statische Hilfsmethoden müssen, werden verspottet, dann können Sie ernsthaft erwägen Sie die Injektion von einem Mitarbeiter. A contrario Sie müssen nie zu verspotten StringUtils, Iterables, oder irgendetwas anderes. Auch vergessen Sie nicht, wir sind mit einer Objekt-orientierten Sprache, es ist alles über das messaging zwischen Objekten (Zitat Alan Kay). Wenn Sie interessiert sind, es gibt ein tolles Buch : Growing Object-Oriented Software Guided by Tests. Grüße 🙂
Die führenden
doNothing()
nennen ist überflüssig. Sie müssen nurdoThrow(new Exception()).when(StaticResource.class);
auf dieser Linie.InformationsquelleAutor Brice
Können Sie stub eine statische void-Methode wie diese:
Obwohl ich nicht sicher bin, warum Sie stören würde, weil, wenn Sie anrufen mockStatic(StaticResource.class) alle statischen Methoden in StaticResource sind standardmäßig gekürzte
Mehr nützlich, Sie können erfassen den Wert übergeben StaticResource.getResource() wie diese:
Dann können Sie auswerten, die Zeichenfolge, die übergeben wurde, um StaticResource.getResource wie diese:
Gibt es eine Möglichkeit zu vermeiden, mit Saiten für die Methoden - als "getResource" in deinem Beispiel?
InformationsquelleAutor Justin Rowe
In einfacheren Worten,
Stellen Sie, wenn Sie wollen, mock folgende Zeile:
dann schreiben Sie folgenden Zeilen von code zu verspotten:
InformationsquelleAutor Vivek HJ
Zu verspotten, eine statische Methode, die "void" zurückgeben für z.B.
Fileutils.forceMKdir(File file),
Beispielcode:
InformationsquelleAutor Oshin Talreja