5

私は .NET 派で、主に C# でコーディングしています。

C# 3.0 以降、ラムダ式と式ツリーを利用して静的リフレクションを使用できます。たとえばGetMethodName、次のスニペットで実装して、パラメーターに渡されたメソッドの名前を返すことができます。

string methodName = GetMethodName( o => o.DoSomething());
Console.WriteLine(methodName); // displays "DoSomething"

さて、Java の世界で Mockito サンプル (または EasyMock サンプル) を見ると、次のことがわかります。

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");

それはどのように機能しますか?

whenメソッドはどのように機能しますか? 値としてではなくパラメータとして 0 が渡された get メソッドの呼び出しmockedList.get(0)としてどのように解釈されますか?

4

4 に答える 4

5

通常、モッキング ライブラリは式ツリーでは機能しません。それらは、適切なインターフェースを実装するタイプを構築し、それらを記録するか、それらを検証して事前にプログラムされた応答を返すことにより、メソッド呼び出しに応答します。これは通常、プロキシ ( .NET のRealProxy 、Java のProxyなど) または動的コード生成のいずれかで行われます。

EasyMock の場合Proxy、ソース コードでわかるように、(とにかくインターフェイスに) を使用します: を見てくださいorg.easymock.internal.JavaProxyFactory

于 2009-03-09T14:06:38.820 に答える
4

Java モック ライブラリは通常、次のように機能します。

モックを作成すると、実際のプロキシが (インターフェイスまたはサブクラスから) 作成され、インスタンスは「記録モード」になります。これは、後続の呼び出しが記録されることを意味します (メソッド名、パラメーター、予期される戻り値)。記録モードのプロキシは、実際には通話を記録するだけであることに注意してください。リフレクション自体は関係ありません。メタデータの発見などはありません。もちろん、これらのライブラリはいくつかのトリックを行います (void を返すメソッドを処理するために呼び出しをスレッドローカル変数に格納するなど) が、考え方は変わりません。

次に、「リプレイモード」が開始されると、モックインスタンスは呼び出しのリスト (メソッド + パラメーター & 戻り値) からの期待を単純にチェックします。

于 2009-03-09T16:55:50.410 に答える
2

私はmockitoやeasymockを使ったことはありませんが、呼び出しがあなたが思っていることをするとは思いません。mockedList.get(0)特別な解釈はしません。オブジェクトに対してメソッドが正常にget実行され、その結果が に渡されます。mockedListwhen

于 2009-03-09T14:03:16.223 に答える
1

mockedList.get(0)メソッド呼び出しの構文であり、まさにそれを行います。そのメソッドが何をするかは正確にはわかりません。の実行時の型は、メソッドによって返されるmockedListのサブクラスになります。これは、モッキング フレームワークが適切と考える方法で実装できます。LinkedListmock

于 2009-03-09T14:05:33.550 に答える