これは議論の余地があることを知っていますが、これが私にとって最良の選択肢であると仮定しましょう。私はこれを行うための実際のテクニックは何なのかと思っています。私が見るアプローチはこれです:
1)テストするメソッドのクラスのフレンドクラスを作成します。
2)friendクラスで、テストされたクラスのプライベートメソッドを呼び出すパブリックメソッドを作成します。
3)friendクラスのパブリックメソッドをテストします。
上記の手順を説明する簡単な例を次に示します。
#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;
}
編集:
私のコードベースについて人々が疑問に思っている答えの1つに続く議論で私はわかります。
私のクラスには、他のメソッドによって呼び出されるメソッドがあります。これらのメソッドはいずれもクラスの外部で呼び出されるべきではないため、プライベートにする必要があります。もちろん、これらを1つの方法に入れることもできますが、論理的にははるかに優れています。これらのメソッドは単体テストを保証するほど複雑であり、パフォーマンスの問題のため、これらのメソッドをリファクタリングする必要がある可能性が非常に高いため、リファクタリングが何も壊さないことを確認するテストを行うとよいでしょう。テストを含めてこのプロジェクトに取り組んでいるのは私だけですが、チームで作業しているのは私だけではありません。
上記のことを言っても、私の質問は、プライベートメソッドの単体テストを書くのが良い習慣かどうかではありませんでしたが、フィードバックに感謝しています。