Rhino.Mocks を使用して静的メソッドをモックすることは可能ですか? Rhino がこれをサポートしていない場合、同じことを実現できるパターンまたは何かがありますか?
6 に答える
Rhino.Mocks を使用して静的メソッドをモックすることは可能ですか?
いいえ、できません。
TypeMock は、CLR プロファイラーを使用して呼び出しをインターセプトおよびリダイレクトするため、これを行うことができます。
RhinoMocks、NMock、および Moq は、これらのライブラリが単純であるため、これを行うことができません。CLR プロファイラー API は使用しません。プロキシを使用して仮想メンバーとインターフェイス呼び出しをインターセプトするという点で、より単純です。この単純さの欠点は、静的メソッド、静的プロパティ、シールされたクラス、非仮想インスタンス メソッドなど、特定のものをモックできないことです。
別のクラスの仮想インスタンス メソッドで静的メソッド呼び出しをラップし、それをモックします。
TypeMock を使用してメソッド呼び出しをインターセプトできない場合、使用する推奨パターンは、テストに関心のある非仮想メソッドまたは静的メソッドに転送するプロキシを作成し、プロキシに期待値を設定することです。説明のために、次のクラスを考えてみましょう。
class TypeToTest
{
public void Method() { }
}
interface ITypeToTest
{
void Method();
}
class TypeToTestProxy : ITypeToTest
{
TypeToTest m_type = new TypeToTest();
public void Method() { m_type.Method(); }
}
このプロキシを作成することによりITypeToTest
、インスタンスを渡したり設定したりしていた場所の代わりに を使用できるTypeToTest
ようになり、デフォルトの実装がTypeToTestProxy
実際の実装に転送する際に を使用するようになります。次に、テスト コードでモックを作成し、ITypeToTest
それに応じて期待値を設定できます。
これらのプロキシの作成は非常に面倒で、エラーが発生しやすく、時間がかかることに注意してください。これに対処するために、これらの型を含むアセンブリを生成するライブラリと一連のツールを維持しています。詳細については、このページを参照してください。
これが Rhino Mocks の最大の欠点です。Rhino Mocks がどのようにモッキングを行うかを再概念化せずにこれを実装することさえ可能であることを私は知りません。
私が知っている唯一のモック フレームワークで、モックの静的をサポートするのは TypeMock です。
Rytmis が提案したように、モックアウトできる何か (つまり、仮想メソッドまたはインターフェイスを持つインスタンス クラス) で静的をラップする必要があります。
私は moq を使ってモックしてきましたが、moQ はターゲット (クラスまたはインターフェース) の新しいプロキシを作成するため、これを使用して静的メンバーをモックできるとは思いません。したがって、継承可能なメンバー ( class の場合は virtual 、 interface の場合は public ) のみをモックできます。明らかに、静的メンバーは継承されないため、問題が発生します。