9

ほとんどのモッキング フレームワークはインターフェイスのモッキングのみが可能であり、クラスの仮想メソッドをモッキングできるものもあります。Java モッキング フレームワークの中には、静的クラスをモッキングできるものもあります。

例 Rhino モック:

var mock = MockRepository.GenerateMock<..>();

generate mock メソッドでダウンする「魔法」は何ですか? C# モッキング フレームワークが静的クラスのモッキングを許可しない理由はありますか? それとも単なる「デザインの選択」ですか?

4

3 に答える 3

5

そのようなフレームワークのソース コードを調べて、自分で答えを見つけるのは、実際には非常に楽しく魅力的です。Rhino Mocksはオープンソースであり、Moq他の多くのものと同様です。私は間違いなくそれらの1つに飛び込むことをお勧めします.

内部実装については(ここから):

ただし、フレームワークは非仮想メソッドをモックできないため、TouchIron メソッドを仮想にする必要があります。その理由は奥深くにあります。Rhino Mocks はCastle Dynamic Proxyを使用してモックに必要な型のプロキシ処理を処理しますが、Dynamic Proxy は非仮想メソッドや非抽象メソッドへの呼び出しをインターセプトできません。

于 2013-03-18T20:33:37.673 に答える
4

ほとんどのオープンソースのモックフレームワークは、CastleWindsorのDynamicProxyを使用して、実行時に型を自動的に生成します。これは、期待される動作でプログラムできます。これが、これらのフレームワークのほとんどがインターフェイスまたは抽象クラスを必要とする理由です。仮想メソッド以外のものをモックすることはできません。

アンマネージCLRプロファイラーAPIに基づくCLRタイプを含む、静的および通常の(封印された)クラスを実際にモックできる他の(商用)モックフレームワークが存在します。基本的に、モックフレームワークはプロファイラーとして機能し、JITコンパイルの直前にメモリ内のMSIL命令を変更できます。これにより、メソッドの本体を事前定義された値に置き換えることができます。これらのフレームワークの一部は無料*(Microsoft Fakes、Visual Studio 2012 Ultimateの一部)であり、その他はTypemockなどの有料製品です。

于 2013-03-18T20:52:20.540 に答える
1

ほとんどすべての .NET モッキング フレームワークは、Castle Windsor の動的プロキシ機能を利用しています。そのいくつかを経験することをお勧めします。

于 2013-03-18T20:36:33.630 に答える