11 Stimmen

Verwendung einer Freundesklasse vs. Hinzufügen von Accessoren für Unit-Tests in C++?

Ist es besser, Funktionen hinzuzufügen, die den internen Zustand eines Objekts für Unit-Tests zurückgeben, anstatt die Testklasse zu einem Freund zu machen? - vor allem, wenn es für die Funktionen keine Verwendung gibt, außer für den Fall von Unit-Tests.

0 Stimmen

0voto

Timo Geusch Punkte 23597

Ich denke, man muss unterscheiden zwischen der Zukunftssicherheit der Klasse durch die Bereitstellung von Accessors für ihre Benutzer, wenn dies sinnvoll ist, und der Verbesserung der Testbarkeit. Ich bin auch kein großer Fan davon, Klassen nur zum Zweck des Testens miteinander zu befreundet, da dies eine enge Kopplung an einer Stelle einführt, an der ich sie lieber nicht haben möchte.

Wenn die einzige Verwendung der Accessoren darin besteht, den Testfällen eine Möglichkeit zu bieten, den internen Zustand der Klasse zu überprüfen, ist es normalerweise nicht sinnvoll, sie öffentlich zugänglich zu machen. Außerdem können dadurch Implementierungsdetails festgelegt werden, die Sie vielleicht später ändern möchten, aber nicht können, weil jemand anderes diese Accessoren verwendet.

Die von mir bevorzugte Lösung für dieses Problem wäre die Bereitstellung von geschützt Accessor-Funktionen, um den Benutzern der Klasse deutlich zu machen, dass diese nicht Teil der öffentlichen Schnittstelle sind. Ihre Tests würden dann eine minimale abgeleitete Klasse des Originals erstellen, die Call-Through-Stubs für die Funktionen der übergeordneten Klasse enthält, aber auch die Zugriffsfunktionen öffentlich macht, damit Sie sie in den Testfällen verwenden können.

0 Stimmen

Würden abgeleitete Klassen nicht als Kunden/Nutzer der Klasse betrachtet werden, genauso wie Kunden/Nutzer der öffentlichen Schnittstelle? Wenn die einzige abgeleitete Klasse nicht der Unit-Testing-Stub ist, haben Sie dasselbe Problem, als wenn Sie die Accessoren öffentlich gemacht hätten - Autoren von abgeleiteten Klassen können nicht erkennen, welche geschützten Funktionen aufgerufen werden dürfen und welche nur zu Testzwecken verwendet werden sollten. Wenn Sie die testbezogenen Funktionen ändern, können Sie abgeleitete Klassen zerstören, die nicht wussten, dass sie einen Accessor nicht verwenden dürfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X