この問題は、「基底クラスで保護されたインターフェイスを提供する」パターンを非常に頻繁に使用する現実のプロジェクトから発生します。私はGetValueメソッドの依存関係を置き換えるために、高速で、大部分は非侵襲的なリファクタリングを探していますテスト用のリファクタリング保護された基底クラスの依存性
class UntouchableBase
{
protected: //cannot be called from outer class
int GetValue() { return 42;}//not virtual
//this class has many many more "protected interface" methods
};
class HeavyWeightClassIWantToTest: public UntouchableBase
{
public:
// VeryHeavyClassIWantToTest(...) {} //ignore the creation issue for a heavy weight object here
void MethodThatNeedsTest()
{
//calc some values
int result = GetValue();
//do some other stuff
}
};
:ここ
は小さな例です。 の抽出方法と新しいクラスを追加はHeavyWeightClassIWantToTest
@UPDATEのために許可されている:テスト、問題
TEST(EnsureThat_MyMethodThatNeedsTestDoesSthSpecial)
{
HeavyWeightClassIWantToTest sut = MakeSut();
sut.MethodThatNeedsTest(); //should call a mocked/replaced GetValue()
}
ヒント説明する:現在、我々はテスト目的のためにUntouchableBase
実装を置き換えるために、リンカシームを使用していることを。
コード例を示してください。
'UntouchableBase'どのようアンタッチャブルです: –
UntouchableBaseでの変更は非常に高いコストで行われます。 GetValue()メソッドは仮想ではないので、直接オーバーロードすることはできません。 – mrAtari
"オーバーロード"ではなく "オーバーライド"を意味すると思いますが、誰も 'pUntouchableBase-> GetValue()'を実行していないと指定した場合、中間クラスのバージョンで関数を非表示にできます。 –