2

私は一般的にユニットテストとモッキングに不慣れで、特定のメソッドが同じクラス内の別のメソッドから呼び出されることを確認したいクラスの 1 つのテストを設定しようとしています。したがって、具体的な実装を使用したいと思いますが、その一部をモックアウトします。これは可能ですか?

パブリック クラス MyClass
{
  公開アカウント[] GetAccounts()
  {
      GetAccounts(null) を返します。
  }

  公開アカウント[] GetAccounts(CustomerId id)
  {
      if(id == null)
      {
          // すべてのアカウントを取得
      }
  }
}

そのため、GetAccounts() を呼び出すスタブを設定しようとしています (具体的な実装を使用したい) が、そのメソッドが GetAccounts(null) を呼び出すかどうかを確認したいと思います。

[テスト]
public void GetAccountsTest()
{
  MockRepository モッ​​ク = new MockRepository();
  MyClass スタブ = mocks.Stub();
  using(mocks.Record())
  {
     Expect.Call(() => stub.GetAccounts()).CallOriginalMethod();
     Expect.Call(() => stub.GetAccounts(null));
  }
  mocks.ReplayAll();
  スタブ.GetAccounts();
  mocks.VerifyAll();
}

問題は、stub.GetAccounts() を呼び出すと、リプレイ中に呼び出されると予想される CallOriginalMethod() 行で具象クラスが呼び出されることです。したがって、レコーディング中とテストの実行中の両方で、実装の具体的なメソッドは、単にそれらをモックアウトしたいときに呼び出されます-部分的に説明したように。これは私の誤解ですか?インターフェイスだけでなく、具体的なクラスをモック/スタブ化できないようにする必要がありますか?

モックアウトできるようにしたいメソッドに virtual キーワードを追加する必要がありますか?

これは可能ですか?どうすればいいですか?

4

1 に答える 1

3

PartialMock を使いたくなるかもしれません。仮想メソッドをモックできるようになります。

于 2008-12-15T14:23:24.780 に答える