Ich weiß, dass dies eine umstrittene Praxis ist, aber nehmen wir an, dass dies die beste Option für mich ist. Ich frage mich, was ist die eigentliche Technik, um dies zu tun. Der Ansatz, den ich sehe, ist folgender:
1) Machen Sie eine Freundesklasse zu der Klasse, deren Methode ich testen möchte.
2) Erstellen Sie in der Friend-Klasse eine oder mehrere öffentliche Methoden, die die privaten Methoden der getesteten Klasse aufrufen.
3) Testen Sie die öffentlichen Methoden der Friend-Klasse.
Hier ist ein einfaches Beispiel, um die obigen Schritte zu veranschaulichen:
#include <iostream>
class MyClass
{
friend class MyFriend; // Step 1
private:
int plus_two(int a)
{
return a + 2;
}
};
class MyFriend
{
public:
MyFriend(MyClass *mc_ptr_1)
{
MyClass *mc_ptr = mc_ptr_1;
}
int plus_two(int a) // Step 2
{
return mc_ptr->plus_two(a);
}
private:
MyClass *mc_ptr;
};
int main()
{
MyClass mc;
MyFriend mf(&mc);
if (mf.plus_two(3) == 5) // Step 3
{
std::cout << "Passed" << std::endl;
}
else
{
std::cout << "Failed " << std::endl;
}
return 0;
}
Bearbeiten:
Ich sehe, dass sich in der folgenden Diskussion eine der Antworten über meine Codebasis wundert.
Meine Klasse verfügt über Methoden, die von anderen Methoden aufgerufen werden. Keine dieser Methoden sollte außerhalb der Klasse aufgerufen werden, daher sollten sie privat sein. Natürlich könnten sie zu einer Methode zusammengefasst werden, aber logischerweise sind sie viel besser voneinander getrennt. Diese Methoden sind kompliziert genug, um Einheitentests zu rechtfertigen, und aufgrund von Leistungsproblemen muss ich diese Methoden sehr wahrscheinlich neu faktorisieren. Daher wäre es schön, einen Test zu haben, um sicherzustellen, dass mein Re-Factoring nichts kaputt macht. Ich bin nicht der einzige, der im Team arbeitet, obwohl ich der einzige bin, der an diesem Projekt arbeitet, einschließlich der Tests.
Nach alledem ging es bei meiner Frage nicht darum, ob es eine gute Praxis ist, Komponententests für private Methoden zu schreiben, obwohl ich das Feedback schätze.