1

テスト用にモックしたい多くのメソッドを持つインターフェイスがあり、何もする必要がなく、テスト対象のオブジェクトにそのインスタンスが必要なだけだとします。たとえば、特定のコードに対していくつかのパフォーマンス テスト/ベンチマークを実行したいのですが、このインターフェイスのメソッドが寄与することは望ましくありません。

それを簡単に行うためのツールはたくさんあります。たとえば、

Interface mock = Mockito.mock(Interface.class);
ObjectUnderTest obj = ...
obj.setItem(mock);

または何でも。

ただし、それらにはすべて実行時のオーバーヘッドが伴いますが、これは避けたいものです。

  • Mockito はすべての呼び出しを記録し、後で検証するために引数を隠します
  • JMock など (私は信じています) では、何をするのかを定義する必要があり (それほど大したことではありません)、実行はさまざまな種類のプロキシを経由して実際にメソッドを呼び出します。
  • 古き良き java.lang.reflect.Proxy とその仲間たちは、呼び出されるメソッドに到達する前に、スタック上で少なくともあと数回はメソッド呼び出しを行います。

(これらの例の詳細については喜んで修正しますが、原則は成り立つと思います。)

私が目指しているのは、インターフェイスの「実際の」操作なしの実装です。たとえば、すべてがnullfalseまたはを返すように手動で書くことができます0。しかし、私が怠け者で、インターフェイスにメソッドがたくさんある場合、それは役に立ちません。では、実行時に任意のインターフェイスのこのようなノーオペレーション実装を生成してインスタンス化するにはどうすればよいでしょうか?

バイトコード生成を使用する Powermock や CGLib などの利用可能なツールがありますが、より大きなモッキング/プロキシ コンテキストの一部としてのみであり、内部から何を選択するかはまだわかりません。

OK、例は少し不自然かもしれませんし、プロキシがタイミングに大きな影響を与えるとは思えませんが、そのようなクラスを生成する方法に興味があります. CGLib、ASMで簡単?


編集: はい、これは時期尚早の最適化であり、実際に行う必要はありません。この質問を書いた後、最後の文は、私が与えた実際のユースケースよりも、原則としてそれを行う方法と、動的クラス生成への簡単な方法に興味があるという私の主張を十分に伝えていなかったと思います。最初から言葉遣いが悪いのかもしれません。

4

2 に答える 2

3

これが探しているものかどうかはわかりませんが、Eclipse の「新しいクラス」ウィザードを使用すると、新しいクラスを構築し、スーパークラスやインターフェースを指定できます。許可すると、すべてのインターフェイス/抽象メソッドのダミー実装が自動コード化されます ( でnullない限り戻りますvoid)。それはかなり無痛です。

NetBeans や Idea など、他の「有名」な IDE にも同様の機能があるのではないかと思います。


編集:

あなたの質問をもう一度見てみると、テスト クラスを扱うときに自動プロキシのパフォーマンスを気にするのはなぜだろうか。パフォーマンスが問題になる場合は、「実際の」機能をテストする必要があり、とにかくほとんど実装されていないクラスを扱っている場合は、パフォーマンスが重要なテスト状況にいるべきではないようです。

于 2010-06-22T11:41:06.860 に答える
0

ユーティリティを構築するには少し手間がかかりますが、Javassist コード生成を使用して実行時にすべての null バージョンを実装するクラスをテキストで作成するために、Javassist コード生成を使用して、「エッジ ケース」(注釈など) のない基本的なバニラ Java インターフェースではおそらくそれほど難しくありません。インターフェイスで定義されたメソッド。これは、まだいくつかの間接的なレイヤーを持つ Javassist ProxyFactory (または CGLib Enhancer) プロキシ オブジェクトとは異なります。直接バイトコード生成モードから得られるクラスにオーバーヘッドはないと思います。勇気があれば、ASM に飛び込んで同じことを行うこともできます。

于 2012-02-14T04:26:47.600 に答える