[.NET] 抽象クラスの private メソッドを単体テストする @VS2008
こんなテストターゲットがあったとします。
namespace 抽象クラス {
internal abstract class AbstractClass1 {
protected int _num;
internal AbstractClass1() {
this._num = 1;
}
protected abstract bool foo(int n);
private bool bar(int n) {
return (this._num == n);
}
}
}
さて、 この private なメソッド bar() を、 Visual Studio 2008 のユニットテスト機能で、 直接テスト出来るでしょうか?
※ 通常は、 private メソッドを呼び出している protected 以上のメソッドが必ず存在しますから、 そこをテストすることで間接的に private メソッドをテストできます。 その手法では、 対象メソッドが複雑すぎてやってられない、 というとき、 private メソッドを直接テストしたくなるわけです。
まず、 いくらなんでも抽象クラスだけではインスタンス化できませんから、 どうしても実装クラスは必要です。
namespace 抽象クラス {
#if UNIT_TEST
internal class ConcreteClass1 : AbstractClass1 {
protected override bool foo(int n) {
return (base._num != n);
}
}
#endif
}
この ConcreteClass1 に対して、 単体テストウィザードでテストコードを自動生成させれば、 ConcreteClass1 の方に実装されている protected メソッド foo() はテストできます。 ( InternalsVisibleTo 属性を有効にさせるのを、 忘れずに。 )
でも、 それで自動生成された ConcreteClass1_Accessor クラスを使って、 親クラスの private メソッド bar() をテストしようとしても、 出来ません。
そこで、 こんな風にして AbstractClass1 のアクセッサを作ってやります。
[TestMethod()]
[DeploymentItem("抽象クラス.dll")]
public void barTest()
{
// 実装クラスのインスタンスから、
// 抽象クラス (親) の Accessor を生成する。
PrivateObject po = new PrivateObject(
new ConcreteClass1(),
new PrivateType(typeof(AbstractClass1))
);
AbstractClass1_Accessor target
= new AbstractClass1_Accessor(po);
// 親クラスの実装 private bar()
Assert.IsFalse(target.bar(0));
Assert.IsTrue(target.bar(1));
// 子クラスの実装 protected foo() も見える
Assert.IsTrue(target.foo(0));
Assert.IsFalse(target.foo(1));
}
| 固定リンク
「プログラミング ( 2008.04-06 )」カテゴリの記事
- MSDN フォーラムで、 カレンダーコントロールのアイディアを募集中(2008.06.09)
- [わんくま同盟 名古屋勉強会] 第2回 (2008/04/26) の資料(2008.04.26)
- [.NET] Nullable 型の足し算(2008.06.30)
- TDD で出来上がるもの(2008.06.26)
- 家の設計費とソフトウェアの設計費(2008.06.27)







コメント