テスト用にモックしたい多くのメソッドを持つインターフェイスがあり、何もする必要がなく、テスト対象のオブジェクトにそのインスタンスが必要なだけだとします。たとえば、特定のコードに対していくつかのパフォーマンス テスト/ベンチマークを実行したいのですが、このインターフェイスのメソッドが寄与することは望ましくありません。
それを簡単に行うためのツールはたくさんあります。たとえば、
Interface mock = Mockito.mock(Interface.class);
ObjectUnderTest obj = ...
obj.setItem(mock);
または何でも。
ただし、それらにはすべて実行時のオーバーヘッドが伴いますが、これは避けたいものです。
- Mockito はすべての呼び出しを記録し、後で検証するために引数を隠します
- JMock など (私は信じています) では、何をするのかを定義する必要があり (それほど大したことではありません)、実行はさまざまな種類のプロキシを経由して実際にメソッドを呼び出します。
- 古き良き java.lang.reflect.Proxy とその仲間たちは、呼び出されるメソッドに到達する前に、スタック上で少なくともあと数回はメソッド呼び出しを行います。
(これらの例の詳細については喜んで修正しますが、原則は成り立つと思います。)
私が目指しているのは、インターフェイスの「実際の」操作なしの実装です。たとえば、すべてがnull
、false
またはを返すように手動で書くことができます0
。しかし、私が怠け者で、インターフェイスにメソッドがたくさんある場合、それは役に立ちません。では、実行時に任意のインターフェイスのこのようなノーオペレーション実装を生成してインスタンス化するにはどうすればよいでしょうか?
バイトコード生成を使用する Powermock や CGLib などの利用可能なツールがありますが、より大きなモッキング/プロキシ コンテキストの一部としてのみであり、内部から何を選択するかはまだわかりません。
OK、例は少し不自然かもしれませんし、プロキシがタイミングに大きな影響を与えるとは思えませんが、そのようなクラスを生成する方法に興味があります. CGLib、ASMで簡単?
編集: はい、これは時期尚早の最適化であり、実際に行う必要はありません。この質問を書いた後、最後の文は、私が与えた実際のユースケースよりも、原則としてそれを行う方法と、動的クラス生成への簡単な方法に興味があるという私の主張を十分に伝えていなかったと思います。最初から言葉遣いが悪いのかもしれません。