Ich versuche, eine Methode in einer Klasse zu testen, die einige private Felder initialisiert:
%Vor%Mein Dilemma ist, dass ich behaupten möchte, dass die Felder "Sprache", "Land" und "Credits" nach dem Aufruf von "init" gesetzt wurden, jedoch sind sie privat und ohne öffentliche Zugriffsmethoden. Ich sehe, es gibt zwei Lösungen zum Testen:
Was halten Sie für den idealen Weg, diese Methode zu testen?
Sie können Reflektionen verwenden, um die Werte von privaten Feldern abzurufen. Zum Beispiel:
%Vor% Wenn Ihr Klassenpfad eine Quelle enthält, können Sie ReflectionUtils
/ ReflectionTestUtils
verwenden.
Es wird manchmal argumentiert, dass private Felder nicht verifiziert werden sollten, und nur der öffentliche Zustand des Objekts ist der Punkt der Komponententests. Aus dieser Perspektive kann es besser sein, einen Getter zu exponieren, oder besser - eine Ausnahme auszulösen.
Wenn das Objekt in einem ungültigen Zustand ist, wenn die Felder nicht gesetzt sind, dann sollte das Objekt selbst dafür verantwortlich sein, seine Gültigkeit zu erzwingen, indem es eine Ausnahme auslöst.
Ich möchte bestätigen, dass die Felder Sprache, Land und Credits nach Aufruf von init
gesetzt wurden
Eine Philosophie: Warum kümmert es dich, ob sie richtig eingestellt sind? Wenn die Antwort lautet "also verhält sich die Klasse dann korrekt", dann können Sie testen, dass sie korrekt eingestellt sind, indem Sie das erwartete nachfolgende Verhalten testen. Wenn sie jedoch falsch gesetzt werden, sind sie redundant und Sie sollten sie entfernen.
Ein anderes Poster hat vorgeschlagen, Reflexion zu verwenden, um auf die privaten Felder zuzugreifen. Ich rate davon ab; Alles, was als privat gekennzeichnet ist, sollte ein Implementierungsdetail der Klasse sein und sollte daher nicht direkt getestet werden. Sie sollten stattdessen die veröffentlichte API Ihrer Klasse testen. Sie haben dann die Freiheit, es einfach umzugestalten, indem Sie die (privaten) Details der Implementierung ändern.
Ich versuche normalerweise, Tests zu vermeiden, die von der internen Struktur der zu testenden Klasse abhängen. Ich würde das lieber testen, indem ich eine Methode teste, die diese Felder dann verwendet.
Wenn Sie striktes TDD ausführen, sollten Sie diese Felder nicht einmal hinzufügen, bis Sie einen Testfall haben, der sie tatsächlich ausnutzt:)
Ich persönlich würde nur die öffentlichen Methoden überprüfen. Manchmal müssen Sie die Interna überprüfen, aber das ist selten.
BTW: Eine Alternative zu öffentlichen Gettern besteht darin, den Unit-Test im selben Paket durchzuführen und lokale Getter bereitzustellen.
Tags und Links java unit-testing