私はやろうとしているユニットテスト(使用してブーストという C++ クラスに、ユニット テスト フレームワーク (単体テスト フレームワーク) を適用しましたVariableImpl
。詳細は次のとおりです。
class Variable
{
public:
void UpdateStatistics (void) {
// compute mean based on m_val and update m_mean;
OtherClass::SendData (m_mean);
m_val.clear ();
}
virtual void RecordData (double) = 0;
protected:
std::vector<double> m_val;
private:
double m_mean;
};
class VariableImpl : public Variable
{
public:
virtual void RecordData (double d) {
// Put data in m_val
}
};
平均が正しく計算されているかどうかを確認するにはどうすればよいですか? 1)m_mean
は保護されており、2)UpdateStatistics
別のクラスのメソッドを呼び出してベクトルをクリアすることに注意してください。
私が考える唯一の方法は、ゲッター (たとえば、GetMean
) を追加することですが、この解決策はまったく気に入りませんし、最もエレガントだとも思いません。
どうすればいいでしょうか?
プライベート変数ではなくプライベートメソッドをテストする場合はどうすればよいでしょうか?
ベストアンサー1
良い、ユニットテストはテストすべきユニット理想的には、すべてのクラスは自己完結型のユニットです。これは単一責任の原則に直接従います。
したがって、クラスのプライベート メンバーをテストする必要はありません。クラスは、そのまま単体テストでカバーできるブラック ボックスです。
一方、これは常に正しいわけではなく、時には正当な理由がある場合もあります (たとえば、クラスのいくつかのメソッドが、テストする必要があるプライベート ユーティリティ関数に依存している可能性があります)。非常にシンプルで、非常に不格好ですが、最終的に成功する解決策の 1 つは、ユニット テスト ファイルに次のコードを追加することです。前にクラスを定義するヘッダーを含めます:
#define private public
もちろん、これはカプセル化を破壊し、悪しかし、テストには目的を果たします。