我通常是单元测试和模拟的新手,并且正在尝试为我的一个类设置测试,我想确保从同一个类中的另一个方法调用特定方法。因此,我想使用具体的实现,但要模拟它的一部分。这可能吗?
公共课 MyClass
{
公共帐户[] GetAccounts()
{
返回GetAccounts(空);
}
public Accounts[] GetAccounts(CustomerId id)
{
如果(id == null)
{
// 获取所有账户
}
}
}
因此,我试图设置一个将调用 GetAccounts() 的存根(我想使用具体的实现),但我想检查该方法是否调用 GetAccounts(null)。
[测试]
公共无效GetAccountsTest()
{
MockRepository 模拟 = new MockRepository();
MyClass 存根 = mocks.Stub();
使用(模拟。记录())
{
Expect.Call(() => stub.GetAccounts()).CallOriginalMethod();
Expect.Call(() => stub.GetAccounts(null));
}
模拟.ReplayAll();
stub.GetAccounts();
mocks.VerifyAll();
}
问题是具体类在 CallOriginalMethod() 行上被调用,当我调用 stub.GetAccounts() 时,我希望在重放期间调用该行。因此,无论是在录制期间还是在我执行测试时,当我只是想模拟它们时都会调用实现的具体方法——正如我已经解释的那样。这是我的误解吗?我应该不能模拟/存根具体类和接口吗?
我是否需要将 virtual 关键字添加到我希望能够模拟的方法中?
这甚至可能吗?我该怎么做?