クラスとインターフェースのレベル、つまりLevel1
、 、Level2
およびがありLevel3
ます。
クラスはクラスLevel1
に依存しLevel2
、クラスはクラスLevel2
に依存しLevel3
ます。
そのデザインのコードは次のとおりです。
public interface ILevel1
{
string GetData();
}
public class Level1 : ILevel1
{
ILevel2 level2;
public Level1(ILevel2 level2)
{
this.level2 = level2;
}
public string GetData()
{
// some more process on data.
var data = level2.GetDataAndProc();
data = data + ",Proc at Level1";
return data;
}
}
public interface ILevel2
{
string GetDataAndProc();
}
public class Level2 : ILevel2
{
ILevel3 level3;
public Level2(ILevel3 level3)
{
this.level3=level3;
}
public string GetDataAndProc()
{
var data=level3.GetDataFromDB();
// processing on the data from db.
data=data+ " Processed at level2";
return data;
}
}
public interface ILevel3
{
string GetDataFromDB();
}
public class Level3 : ILevel3
{
public string GetDataFromDB()
{
// Functionalities to get data from db.
return "DB Data";
}
}
これで、分離モック インターフェイスでクラスを単体テストLevel1
し、分離モックインターフェイスLevel2
でクラスを単体テストできます。私はテスト フレームワークとモック フレームワークとして使用しています。Level2
Level3
Nunit
NMock
ここまでは順調ですね。
しかし、最初の 2 つのレベルのコードのみをモックするLevel3
インターフェイスをモックせずLevel2
に単体テストできますか? つまり、モックLevel1
ではなくモックでクラスを単体テストしたいということです。クラスがDBからデータを取得し、このDBレイヤーのみをモックして、プロジェクト全体が実際のdbではなくモックdbだけで動作するようにしたいので、これをやりたかったのです。Level2
Level3
Level3