単体テストで使用する新しい一時的な (永続化されていない) オブジェクトを返す (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() アドバイスを行う必要があるのではないでしょうか?