1

単体テストで使用する新しい一時的な (永続化されていない) オブジェクトを返す (Spring Roo DataOnDemand から) 次のようなクラスがあります。これは、Spring Roo の ITD からプッシュインした後のコードです。

public class MyObjectOnDemand {
    public MyObjectOnDemand getNewTransientObject(int index) {
        MyObjectOnDemand obj = new MyObjectOnDemand();
        return obj;
    }
}

私がしなければならないことは、返されたオブジェクト参照に対して追加の呼び出しを行い、Spring Roo の自動生成メソッドが処理していない追加のフィールドを設定することです。したがって、上記のコードを変更する (または Roo の ITD からプッシュする) ことなく、次の呼び出しを 1 つ追加します。

obj.setName("test_name_" + index);

これを行うために、適切なポイントカットを持ち、特定のメソッドをアドバイスする新しいアスペクトを宣言しました。

public aspect MyObjectDataOnDemandAdvise {
    pointcut pointcutGetNewTransientMyObject() : 
        execution(public MyObject MyObjectDataOnDemand.getNewTransientObject(int));

    after() returning(MyObject obj) : 
        pointcutGetNewTransientMyObject() {
         obj.setName("test_name_" + index);
    }
}

現在、Eclipse によると、ポイントカットは適切に記述されており、適切な方法をアドバイスしています。ただし、 name 属性が必要であるが設定されていないため、オブジェクトを永続化する統合テストがまだ失敗しているため、発生していないようです。Manning の AspectJ in Action (セクション 4.3.2) によると、after アドバイスは戻り値を変更できるはずです。しかし、代わりに around() アドバイスを行う必要があるのではないでしょうか?

4

3 に答える 3

3

tgharold の応答にコメントを追加したはずですが、十分な評判がありません。(これは私の最初の投稿です)

私はこれが古いことを知っていますが、ここを見ている他の人が、を使用して AspectJ のアドバイス前またはアドバイス後の引数を取得できることを知るのに役立つと思いますthisJoinPoint

例えば:

after() : MyPointcut() {
    Object[] args = thisJoinPoint.getArgs();
    ...

詳細については、http: //eclipse.org/aspectj/doc/next/progguide/language-thisJoinPoint.htmlを参照してください。

それが誰かに役立つことを願っています。

于 2013-10-03T11:20:24.560 に答える
0

というわけで、Eclipse のバグが原因であることがわかりました。Spring Roo シェルで「テストの実行」を実行するとすべてが機能しましたが、パッケージを JUnit テスト ケースとして実行すると機能しませんでした。

上記のコードは、「返却後」のアドバイスを使用して機能します。ただし、メソッドに渡された引数にアクセスできる「アラウンド」アドバイスを使用して実装することもできます。

 MyObject around(MyObjectDataOnDemand dod, int index) :
    pointcutGetNewTransientMyObject() 
    && target(dod) && args(index) {

     // First, we go ahead and call the normal getNewTransient() method
     MyObject obj = proceed(dod, index);

     /*
     * Then we set additional properties which are required, but which
     * Spring Roo's auto-created DataOnDemand method failed to set.
     */
     obj.setName("name_" + index);

     // Lastly, we return the object reference
     return obj;
 }

私たちの特定のケースでは、「返却後」のアドバイスはより簡潔で読みやすいものでした。しかし、引数へのアクセスを取得するために "around" アドバイスを使用する方法を知っておくことも役に立ちます。

于 2012-11-14T02:35:44.043 に答える
0

around の使用例を次に示します。

pointcut methodToMonitor() : execution(@Monitor * *(..));

Object around() : methodToMonitor() {
    Object result=proceed();

    return result;
}
于 2012-11-15T20:11:14.803 に答える