Wie testet man die void-Methode, die nur private Membervariable der Klasse ändert?

7

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:

  1. Machen Sie öffentliche Methoden für den Zugriff auf die privaten Felder, und rufen Sie diese Methoden nach dem Testen der init-Methode auf.
  2. Machen Sie den Komponententest, rufen Sie einfach die init-Methode auf und gehen Sie davon aus, dass alles korrekt funktioniert hat, ohne dass eine Ausnahme ausgelöst wurde.

Was halten Sie für den idealen Weg, diese Methode zu testen?

    
James Goodwin 05.01.2011, 12:11
quelle

5 Antworten

9

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.

    
Bozho 05.01.2011 12:16
quelle
9
  

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.

    
Raedwald 05.01.2011 12:57
quelle
4

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:)

    
Mikko Wilkman 05.01.2011 12:26
quelle
1

Ruft Ihre JUnit die Methode direkt auf? Dann ist der Verweis auf das Property-Objekt derselbe, Sie sollten auf Sprache und Land zugreifen können, denn Credits machen die Neuberechnung in Ihrer JUnit.

Öffentlicher Accessor für private Methoden ist auch eine gute Wahl.

    
ssedano 05.01.2011 12:16
quelle
1

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.

    
Peter Lawrey 05.01.2011 13:14
quelle

Tags und Links