2

我通常是单元测试和模拟的新手,并且正在尝试为我的一个类设置测试,我想确保从同一个类中的另一个方法调用特定方法。因此,我想使用具体的实现,但要模拟它的一部分。这可能吗?

公共课 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 关键字添加到我希望能够模拟的方法中?

这甚至可能吗?我该怎么做?

4

1 回答 1

3

看起来您可能想要使用 PartialMock。它将允许您模拟虚拟方法。

于 2008-12-15T14:23:24.780 回答