0

私は JUnit と Javassist について非常に浅い理解を持っていますが、それらを使用してプログラム分析を行いたいだけです。たとえば、ライブラリが与えられた場合、ランタイム中にライブラリ内のどのメソッドが呼び出されたかを知りたいとします。バイトコード操作を使用して system.out.println("method_name"); を挿入できます。メソッドの先頭にあるステートメント。そのため、実行時に、呼び出されたメソッドが出力されます。

スタンドアロン アプリケーションでは、main() が呼び出される前にインターセプトして、独自のクラス ローダーを使用できます (以下を参照)。ただし、JUnit には main() がありません。この状況でインターセプトする方法を教えてもらえますか? どうもありがとう。

...
  Loader loader = new Loader( pool );
  loader.addTranslator( pool, xlat );
  loader.run( className, args );
...

編集:JUnit 4.8とJavassist 3.15.0.GAを使用しています

4

1 に答える 1

0

代わりに別のアプローチをお勧めできますか? AspectJを使用して、代わりにアスペクト指向のアプローチを使用できます。これにより、監視するメソッドのサブセットまたはすべての周りにポイントカットを定義できます。

もう 1 つのオプションは、コード カバレッジを監視しようとしている場合 (JUnit を使用していて、単に実行しようとしているという事実System.out.println(...)が良いヒントです)、コード カバレッジ ツールを探しているのではないでしょうか? もしそうなら、Coberturaが最善の策です。カスタム コーディングは必要ありません。

これらのオプションはどちらも独自のバイトコード操作を行いますが、開発者が維持する必要があるものではありません。

Eclipse を IDE として使用している場合、これらは両方とも Eclipse と非常にうまく連携します。AspectJ は実際には Eclipse プロジェクトですが、Eclipse は必要ありません。Cobertura の Eclipse プラグインはeCoberturaです。

これに対するさらに別のオプションは、JUnit 自体の中で実行することです。これには、バイトコード操作は必要ありません。そのTestWatchmanクラスを見てください。他のライブラリと同様に、これについてはまだオンラインで文書化していませんが、 JUnit ユーティリティ ライブラリBaseTestの一部として、私のクラスを参照してください。これを拡張する JUnit テスト クラスは、各テストの開始時、成功時、または失敗時に (SLF4J に) 自動的にログを記録します。ただし、これはすべてテスト レベルのみであり、各テストが実行する他のメソッドの監視には役立ちません。

于 2011-12-10T15:13:37.613 に答える