2013-07-14 8 views
9

Ich habe fast alle JUnit + Maven + AspectJ Fragen hier gefolgt und sogar ich bin mir ziemlich sicher, dass ich alles richtig eingestellt habe, kann ich nicht testen es.AspectJ + Junit + Maven - Pointcut in Tests erkannt, aber NoSuchMethodError: aspectOf() Exception ausgelöst

Ich habe eine Maven-Modul mit nur einem Aspekt: ​​

@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"); 
    } 
} 

Sehr ziemlich einfach. Ich möchte vor und nach jeder Ausführung einer Testmethode in meinem Testprojekt etwas tun, das mit @Test versehen ist.

Nun, ich bin mit aspectj-maven-plugin in meinem <build> wie folgt aus:

<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) Ich habe keine compile Ziel in <execution>, weil ich keine Klassen in src/main/java haben (das ist wahr, und es ist in Ordnung, ich weiß, was ich tue)

2) I

<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> 

in meinem <dependencies> Abschnit haben auf. Nichts mehr über aspectj.

3) Ich bin mir sicher, dass meine Testklassen von aspectj erkannt werden, weil ich sehe, dass Join Points empfohlen wurden. Ich sehe:

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)) 

Das gleiche gilt für nach Beratung.

4) Als ich Version 1.6.1 anstelle von 1.6.11 ausprobierte, erschien mir diese Nachricht, während Join-Punkte behandelt wurden: expected 1.6.11 found 1.7.3. Ich denke, es ist eine Nachricht von aspectj-maven-plugin der Version 1.4, ich weiß nicht wirklich, wann 1.5 Release sein wird, um das loszuwerden. Welche Versionen sind kompatibel?

5) Mein "Code" sieht wie folgt aus :)

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

    @Test 
    public void test01(){ 
    } 
} 

6) Ich habe 1.6.0_39 Oracle Java-Compiler, ich kompilieren alles mit 1,6 (Ziel, Quelle .. alle)

So Aspekte anerkannt, angewendet werde ich Tests wie mvn clean test auszuführen, aber alles, was ich bekommen ist, dass:

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

und ziemlich lange Stacktrace.

Ich habe keine keine Ahnung, was könnte falsch sein, wirklich.

+0

funktioniert es für Java 8 auch? –

Antwort

9

So, das war der Trick, dass die Bibliothek mit meinen Aspekten kompilieren nicht mit javac aber mit ajc (aka aspectj-Maven-Plugin)

Das ist es. Ich musste dies nur in das Maven-Modul mit Aspekten hinzufügen (sie sind in src/main/java)

Aspekte sind Annotation geritten, so dass Sie haben haben 1.6 Quelle/Ziel/Konformitätsstufe

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> 

als Sie dieses Modul als Test Abhängigkeit in Ihrem Ziel Modul hinzufügen müssen Sie Aspekte verwenden, mit

TARGET MODULE

wollen
<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> 

Sie müssen überall 1,6-Ebene verwenden

+0

fantastisch danke, Mann –