2009-08-09 22 views
10

アスペクトを記述するとき、それらが一致していることをテストして、それらが欲しいときに呼び出される方法を教えてください。Spring AOPのアスペクトのテスト

私は、Spring 2.5.6で@Aspect宣言を使用しています。


私はこの機能を気にしませんが、それ以外の方法で抽出してテストします。

答えて

7

私は次のように、統合テストのビットである何かを作成することになった:

は春を意識したJUnitテストこのテストそのためのバネの設定を作成し

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "aspects-test.xml" }) 
public class SomeAspectTest { 

} 

を作成:

  • は@AspectJの使用を有効にします。
  • はダミーの依存関係を持つ私の側面を構成し
  • は、私はダミーのサービスを取得し、そのメソッド呼び出しのユニットテストでは縦横

    <aop:aspectj-autoproxy /> 
    <bean class="SomeAspect"> 
        <property name="userDetailsSource"> 
          <bean class="StubUserDetailsSource"/> 
        </property> 
    </bean> 
    <bean class="DummyService"/> 
    

によってピックアップされるべきBeanを宣言する

@Autowired 
private DummyService _dummyService; 

@Test(expected = ApplicationSecurityException.class) 
public void adminOnlyFails() throws ApplicationSecurityException { 

    _dummyService.adminOnly(); 
} 
+0

詳細を教えてください。 – Javatar

+2

本当に多くのロジックが実際に実行時に生成された場合、半積分テストを作成するのが普通だと思います。 – Gepsens

+0

したがって、アスペクトメソッドを呼び出すメソッドを呼び出しますが、アスペクトメソッドが呼び出されていることを確認する方法には決して答えませんでした。 @ジャバール私はそれがあなたが探している詳細だと思いますか?あなたのサンプル・アスペクトが常にApplicationSecurityExceptionをスローすると思いますか?正当なメソッド呼び出しはどうでしょうか? – Jorge

8

ここでテストするには、3つの異なるものがあります:

  1. は、あなたが期待するものに一致するあなたのポイントカットはありますか?
  2. アドバイスは正しいポイントカットを参照していますか?
  3. アドバイスは期待通りに機能しますか?

ポイントカットをテストするために、あなたはまた、(それらが一致していることを確認するためにポイントカットに対する試験アドバイスを定義し、その後、意図した「本物」のターゲットと同じパッケージ/タイプ/メソッドのシグネチャを持っているいくつかのテストの種類を定義することができますpointcutsがあまりにも自由でないことを保証するために一致させるべきでないいくつかの型を定義する)。私は通常、テストターゲット内のメソッドへのコールバックを行い、フラグを設定し、次にフラグがセットされていることを宣言するようにアドバイスを定義することによってこれを行います。

アドバイスをテストするのは難しいです。私はすべてのアドバイス本体を通常の方法に委任し、アドバイスではなくメソッドのテストに集中する傾向があります。

これを実行した場合、唯一の欠点は、あなたのアドバイスが正しいポイントカットに適用され、実際にメソッドを呼び出すことです。これが問題である可能性がある場合は、別のアスペクトを作成し、アドバイスの実行に一致するアスペクトを想定して、委任されたメソッドがアスペクトによって呼び出されたことを示すフラグを設定し、

関連する問題