私は、Javaアプリケーションをテストするときにコードカバレッジを決定し、小規模なプロジェクトに取り組んでいます。これは、基本的には、これらの方法のすべての周り織りがその実行をログに記録することをプロジェクト内のすべてのクラスとメソッドを検索し、データベースに保存しますIDE用のプラグイン、およびAspectJのポイントカットを持つエージェントから構成されています。
私が持っている問題は、私は唯一の実際には非常にプロジェクトの開発者ではなく、基礎となるライブラリの人々によって書かれている方法を記録したいということです。だから、ポイントカットは、実際のプロジェクトパッケージ内のクラスのメソッドだけが織られているような方法で定義する必要があります。エージェントは、プロジェクトのすべての種類で使用されるので、一方、私はそれらのパッケージをハードコーディングすることはできません。
私の試みは、これまでのデータベースからすべてのパッケージ名を読み、そのから文字列を構築することでした。基本的にはそれがどのように見えるこれは次のようになります。
private static final String POINTCUT_STRING = AspectUtil.buildPointcutString();
そして、ポイントカットを定義する場合:
@Pointcut(POINTCUT_STRING)
事は、明らかにポイントカットを定義するときので、これは動作しません、です
属性値は一定にする必要があります。
だから、どのように私は私がパッケージ内のクラスで唯一の織り方法私は私のデータベースに持つことができるというようにそれを作ることができますか?
事前のおかげで、良いものを持っています!
私は、AspectJのはどのような状態管理や変更にウィーバーを公開していないような動的アスペクトアプローチは仕事に行っているとは思いません。これは、実行時に理論的には可能だろうが、それはコンパイル時には絶対に不可能です(そして、あなたはコンパイル時にあなたの側面を追加するオプションを持っています)。
しかし、あなたの問題への...
あなたはどのような織りの戦略を使用していますか?コンパイルまたはランタイム?私は非常にうまく動作するようにコンパイルを見つけたと私は確かにAspectJとランタイムを使用する方法はありませんよ。しかし、私が言えることは、コンパイルを使用する場合それはあなたがにアクセスすることができますすべてであるとして、あなただけどのような場合にアプリケーションクラスを織り込むことだろうということです。
メイクへのもう一つのコメントは、あなたが何かのダイナミックを行いたい場合は、側面の下流のコードカバレッジのためにその方法を監視するかどうかの条件を入れたほうが良いと思います。だから、様相が実行されたとき、それがどうなる最初の事は、このクラス/メソッドの呼び出しがカバレッジを監視し、そこから上に行くべきであるかどうかを判断です...