我通常是单元测试和模拟的新手,并且正在尝试为我的一个类设置测试,我想确保从同一个类中的另一个方法调用特定方法。因此,我想使用具体的实现,但要模拟它的一部分。这可能吗?
公共课 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 关键字添加到我希望能够模拟的方法中?
这甚至可能吗?我该怎么做?