Ich denke, dass man sich eine grundsätzlichere Frage stellen sollte: Warum versuchen Sie überhaupt, die private Methode zu testen? Es riecht nach Code, dass Sie versuchen, die private Methode über die öffentliche Schnittstelle der Klasse zu testen, obwohl diese Methode nicht ohne Grund privat ist, da es sich um ein Implementierungsdetail handelt. Man sollte sich nur mit dem Verhalten der öffentlichen Schnittstelle befassen und nicht damit, wie sie im Verborgenen implementiert ist.
Wenn ich das Verhalten der privaten Methode testen möchte, kann ich ihren Code mit Hilfe gängiger Refactorings in eine andere Klasse extrahieren (vielleicht mit Sichtbarkeit auf Paketebene, um sicherzustellen, dass sie nicht Teil einer öffentlichen API ist). Dann kann ich ihr Verhalten isoliert testen.
Das Produkt des Refactorings bedeutet, dass die private Methode nun eine separate Klasse ist, die ein Kollaborateur der ursprünglichen Klasse geworden ist. Ihr Verhalten wird durch ihre eigenen Unit-Tests gut verstanden werden.
Beim Testen der Originalklasse kann ich dann ihr Verhalten nachahmen, so dass ich mich auf das Testen des Verhaltens der öffentlichen Schnittstelle dieser Klasse konzentrieren kann, anstatt eine kombinatorische Explosion der öffentlichen Schnittstelle und des Verhaltens aller privaten Methoden testen zu müssen.
Ich sehe das ähnlich wie beim Autofahren. Wenn ich ein Auto fahre, dann fahre ich nicht mit offener Motorhaube, damit ich sehen kann, dass der Motor funktioniert. Ich verlasse mich auf die Schnittstelle, die das Auto bietet, nämlich den Drehzahlmesser und den Tachometer, um zu wissen, dass der Motor läuft. Ich verlasse mich darauf, dass sich das Auto tatsächlich bewegt, wenn ich das Gaspedal betätige. Wenn ich den Motor testen will, kann ich das auch isoliert tun :D
Natürlich kann das direkte Testen privater Methoden ein letzter Ausweg sein, wenn Sie eine Legacy-Anwendung haben, aber ich würde es vorziehen, dass Legacy-Code umstrukturiert wird, um bessere Tests zu ermöglichen. Michael Feathers hat ein großartiges Buch über genau dieses Thema geschrieben. http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052
3 Stimmen
Vielleicht übersehe ich etwas, oder vielleicht ist diese Frage einfach nur, nun ja...
pre-historic
in Bezug auf Internet Jahre, aber Unit-Tests von privaten Methoden ist jetzt sowohl einfach und unkompliziert, mit Visual Studio produziert die notwendigen Accessor-Klassen, wenn nötig und Pre-Füllung der Tests Logik mit Schnipseln verdammt nah an das, was man für einfache funktionale Tests wünschen kann. Siehe z.B.. msdn.microsoft.com/de-us/library/ms184807%28VS.90%29.aspx5 Stimmen
Dies scheint fast ein Duplikat zu sein von stackoverflow.com/questions/34571/ .
0 Stimmen
Der Fragesteller verwendet möglicherweise nicht Visual Studio
6 Stimmen
Testen Sie keine internen Einheiten: blog.ploeh.dk/2015/09/22/einheitsprüfung-internes
1 Stimmen
Mögliches Duplikat von Wie teste ich eine Klasse, die private Methoden, Felder oder innere Klassen hat?
0 Stimmen
Die privaten Accessors sind in Visual Studio ab 2012 veraltet.
0 Stimmen
Die Frage ist nicht, ob er eine private Methode testen SOLLTE, sondern WIE er eine private Methode testen kann. Ich streite mich nicht über die Vorzüge der einen oder anderen Methode. Es könnte einen legitimen Grund dafür geben, dass er dies tun will, wie jeder andere auch, der auf der Suche nach einer Lösung hier landet.
0 Stimmen
Ähnlicher Beitrag - Unit-Tests für private Methoden in C#