2013-07-14 14 views
9

ここでJUnit + Maven + AspectJのほぼすべての質問に従っています。それ。AspectJ + Junit + Maven - テストではポイントカットが認識されましたが、NoSuchMethodError:aspectOf()例外がスローされました

私はちょうど一の態様でMavenのモジュールがあります。

@Aspect 
public class AssertionAspect { 

    @Pointcut("execution(@org.junit.Test * *())") 
    public void testMethodEntryPoint() {} 

    @Before("testMethodEntryPoint()") 
    public void executeBeforeEnteringTestMethod() { 
     System.out.println("EXECUTE ACTION BEFORE ENTERING TEST METHOD"); 
    } 

    @After("testMethodEntryPoint()") 
    public void executeAfterEnteringTestMethod() { 
     System.out.println("EXECUTE ACTION AFTER ENTERING TEST METHOD"); 
    } 
} 

非常に非常に簡単。私がしたいのは、私のテストプロジェクトでテストメソッドを実行する前後に、@Testという注釈が付けられていることです。

さて、私はこのような私の<build>aspectj-maven-plugin使用しています:私はsrc/main/javaでは授業がないので、私は私が何を知って、それが本当だと、それはokです(<execution>に何compile目標を持っていない

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>aspectj-maven-plugin</artifactId> 
     <version>1.4</version> 
     <configuration> 
     <aspectLibraries> 
      <aspectLibrary> 
      <groupId>my.package</groupId> 
      <artifactId>with-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <source>1.6</source> 
     <target>1.6</target> 
     </configuration> 
     <executions> 
     <execution> 
      <goals> 
      <goal>test-compile</goal> 
      </goals> 
      <configuration> 
      <showWeaveInfo>true</showWeaveInfo> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

1)私は私が私の<dependencies> sectiに

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.7.3</version> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.7.3</version> 
</dependency> 

を持っている))

2をやっていますに。アスペクトについては何もありません。

3)私はテストクラスがaspectjによって認識されていることを確信しています。なぜなら、私は結合ポイントがアドバイスされていることが分かります。私は参照してください:

Join point 'method-execution(xyz)' in Type 'blabla' 
(AppTestCase.java:124) advised by before advice from 
'blabla' (my-aspects jar.jar!AssertionAspect.class(from AssertionAspect.java)) 

アフターアドバイスのために同じです。

4)1.6.11ではなくバージョン1.7.3を試したとき、このメッセージは私には現れましたが、結合点は処理されました:expected 1.6.11 found 1.7.3。私はそれがバージョン1.4のaspectj-maven-plugin からのメッセージだと思いますが、1.5がいつこれを取り除くためにリリースされるのかは本当に分かりません。互換性のあるバージョンは何ですか?

5)私の "コード" はこの:)

@RunWith(JUnit4.class) 
public class TestClass() { 

    @Test 
    public void test01(){ 
    } 
} 

6のように見える)私は1.6.0_39 OracleのJavaコンパイラを持って、私は

)1.6(ターゲット、ソース...すべてですべてをコンパイルしています

ので、認識の側面は、適用され、私はmvn clean testのようなテストを実行するつもりですが、私が得るすべては、それは次のとおりです。

java.lang.NoSuchMethodError: 
my/aspect/AssertionAspect.aspectOf()Lmy/aspect/AssertionAspect; 

とかなり長いスタックトレース。

私はを持っていません。手がかりが本当に間違っている可能性があります。

+0

はjavaのために働いています8も? –

答えて

9

ので、トリックはこれだけです

のjavacではなくajc(別名AspectJの-のmaven-pluginの)ではない、私の側面と、そのライブラリをコンパイルすることでした。私はちょうどaspect(それらはsrc/main/javaにあります)を持つMavenモジュールにこれを追加しなければなりませんでした。

アスペクトは注釈になりますので、にはがあります。6ソース/ターゲット/コンプライアンスレベル

のAspectJ MODULE

<!-- Build --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
       <verbose>true</verbose> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
      </dependencies> 
     </plugin> 
    </plugins> 
</build> 

あなたがターゲットモジュールにテストの依存関係として、このモジュールを追加するために持っているよりも、あなたが

ターゲットモジュール

と側面を使用したいです
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>that-artifact</groupId> 
         <artifactId>mentioned-above</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>test-compile</goal> 
        </goals> 
        <configuration> 
         <showWeaveInfo>true</showWeaveInfo> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

あなたはどこでも1.6レベルを使用する必要があります

+0

awsomeありがとう、男 –

関連する問題