我有类和接口的级别,即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
作为模拟框架。
到目前为止一切顺利。
但是,我可以单独测试前两级代码仅模拟Level3
界面而不模仿Level2
吗?我的意思是我想在不模仿Level1
但是嘲笑Level2
的情况下对测试类Level3
进行单元化。我想这样做是因为Level3
类从数据库中获取数据,我想只模拟这个数据库层,这样我的整个项目就可以使用模拟数据库,而不是真正的数据库。
答案 0 :(得分:0)
这很简单:
// arrange
var mocks = new Mockery();
var mockLevel3 = mocks.NewMock<ILevel3>();
// now do some actual mocking here
var level2 = new Level2(mockLevel3);
var level1 = new Level1(level2);
// now do some act and assert stuff
在我看来,这是一次集成测试。如果所有类都在同一个程序集中,则此时无关紧要。集成测试不一定是在测试中将某些组件集合在一起。