Erfahren Sie, wie Sie NullPointerExceptions vermeiden, wenn Sie `jmockit` Expectations mit primitiven Typen und Matchern im Unit Testing verwenden.
---
Dieses Video basiert auf der Frage https://stackoverflow.com/q/88743/ gestellt von dem Nutzer 'Kris Pruden' ( https://stackoverflow.com/u/16977/ ) sowie auf der Antwort https://stackoverflow.com/a/90136/ bereitgestellt von dem Nutzer 'Kris Pruden' ( https://stackoverflow.com/u/16977/ ) auf der Website 'Stack Overflow'. Vielen Dank an diese großartigen Nutzer und die Stackexchange-Community für ihre Beiträge.
Besuchen Sie diese Links, um den Originalinhalt und weitere Details zu sehen, z. B. alternative Lösungen, aktuelle Entwicklungen zum Thema, Kommentare, Versionsverlauf usw. Der ursprüngliche Titel der Frage lautete beispielsweise: Using jmockit expectations with matchers and primitive types
Außerdem steht der Inhalt (außer Musik) unter der Lizenz CC BY-SA https://meta.stackexchange.com/help/l...
Der ursprüngliche Fragenbeitrag steht unter der Lizenz 'CC BY-SA 2.5' ( https://creativecommons.org/licenses/... ), und der ursprüngliche Antwortbeitrag steht unter der Lizenz 'CC BY-SA 2.5' ( https://creativecommons.org/licenses/... ).
Falls Ihnen irgendetwas auffällt oder Unstimmigkeiten bestehen, schreiben Sie mir bitte an vlogize [AT] gmail [DOT] com.
---
Lösung des jmockit Expectations Problems mit primitiven Typen
Java-Entwickler stehen beim Unit Testing ihres Codes häufig vor Herausforderungen, insbesondere wenn es um das Mocking von Methoden mit primitiven Typen geht. Dies trifft besonders bei der Verwendung der Bibliothek jmockit zu, einem leistungsstarken Tool zur Erstellung intelligenter Mocks in Java. Falls Sie schon einmal versucht haben, die Klasse Expectations in jmockit mit Matchern für primitive Typen wie boolean zu verwenden, sind Sie möglicherweise auf Schwierigkeiten gestoßen. Dieser Blogbeitrag beleuchtet das Problem und liefert eine klare Lösung dafür.
Das Problem mit Matchern und primitiven Typen
Beim Einsatz von jmockit zum Mocking stoßen viele Entwickler auf eine NullPointerException (NPE), wenn sie versuchen, eine Methode zu mocken, die einen primitiven Typ als Argument erwartet. Dies tritt auf, wie im folgenden Beispiel gezeigt, wenn innerhalb der Methode invokeReturning() ein Matcher verwendet wird. Lassen Sie uns das Problem genauer anschauen:
Beispielcode Analyse
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
In diesem Beispiel wird die Methode getFoo der Klasse MyClass so gemockt, dass sie den Wert „bas“ zurückgibt, wenn sie mit dem Argument is(false) aufgerufen wird. Allerdings führt diese Zeile zu einer NullPointerException. Das Problem scheint in der Verarbeitung des Argumenttyps durch die Methode Expectations.with() zu liegen.
Ursache der NPE
Es stellt sich heraus, dass die Art und Weise, wie die Methode with() mit Typparametern umgeht, zu unerwartetem Verhalten führt. Hier eine kritische Zeile, die zum Problem beiträgt:
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
Diese Zeile gibt null zurück, anstatt einen geeigneten Standardwert für den primitiven Typ bereitzustellen. Das führt dazu, dass das De-Autoboxing zurück zum primitiven boolean eine NullPointerException auslöst. Dadurch wird das Mocken der Methode problematisch, vor allem wenn ein Matcher zusammen mit mehreren Parametern verwendet werden soll.
Die Lösung: Ein Workaround
Obwohl das ursprüngliche Ziel war, einen Matcher mit einem primitiven Typ zu verwenden, ist der beste Ansatz hier, die Art und Weise anzupassen, wie Sie invokeReturning() aufrufen. Anstatt with(is(false)) zu verwenden, was den Fehler verursacht, ändern Sie Ihren Code und verwenden withEqual(false), wie unten gezeigt:
[[Siehe Video, um diesen Text oder Codeausschnitt anzuzeigen]]
Dieser Workaround umgeht die Komplikation, die durch die Verwendung von Matchern mit primitiven Typen entsteht, und ermöglicht Ihnen, Ihr Ziel ohne NullPointerException zu erreichen. Auch wenn dabei nicht vollständig ein Matcher für das boolean-Argument verwendet wird, bietet diese Lösung dennoch einen ausreichend guten Ansatz, bei dem das Hauptziel erhalten bleibt.
Zusammenfassung
Zusammenfassend kann die Verwendung von jmockit mit Matchern und primitiven Typen zu Problemen wie NullPointerExceptions führen. Die Ursache liegt darin, wie die Methode Expectations.with() Typparameter verarbeitet und standardmäßige Werte nicht korrekt generiert.
Der Workaround, den Matcher bei primitiven Werten durch withEqual zu ersetzen, bietet jedoch eine robuste und schnell umsetzbare Lösung. Mit Verständnis für das Problem und diese Lösung können Sie jmockit weiterhin effektiv in Ihren Unit Tests einsetzen und so Ihren Code zuverlässig testen, ohne auf unnötige Fehler zu stoßen.
Wenn Sie diese Anleitung hilfreich fanden oder weitere Fragen zum Unit Testing oder jmockit haben, zögern Sie nicht, unten einen Kommentar zu hinterlassen oder Kontakt aufzunehmen!
Информация по комментариям в разработке