2013-07-14 12 views
9

Ho seguito quasi tutte le domande di JUnit + Maven + AspectJ qui e anche io sono abbastanza sicuro di aver impostato tutto correttamente, non riesco a testare esso.AspectJ + Junit + Maven - collegamento di punti riconosciuto nei test ma NoSuchMethodError: aspectOf() eccezione generata

Ho un modulo di Maven con solo un aspetto:

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

Molto piuttosto semplice. Tutto quello che voglio fare è quello di fare qualcosa prima e dopo ogni esecuzione di qualsiasi metodo di prova nel mio progetto di test che è annotato con @Test.

Ora, io sto usando aspectj-maven-plugin nel mio <build> come questo:

<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) non ho compile obiettivo in <execution> perché non ho lezioni di src/main/java (che è vero ed è ok, lo so cosa sto facendo)

2) devo

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

nei miei <dependencies> secti sopra. Niente di più per quanto riguarda AspectJ.

3) Sono sicuro che le mie lezioni di prova sono riconosciuti da aspectj perché vedo che uniscono stato consigliato punti. Vedo:

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

Stesse riserve per un consiglio postvendita.

4) quando ho provato la versione 1.7.3 invece che 1.6.11, questo messaggio è apparso a me mentre unirsi punti sono stati trattati: expected 1.6.11 found 1.7.3. Credo che sia un messaggio da aspectj-maven-plugin di versione 1.4, non so davvero quando 1.5 sarà comunicato per sbarazzarsi di questo. Quali versioni sono compatibili?

5) Il mio "codice" si presenta come questo :)

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

    @Test 
    public void test01(){ 
    } 
} 

6) Ho 1.6.0_39 Oracle Java compilatore, io sono la compilazione di tutto con 1.6 (target, fonte .. tutto)

Così, gli aspetti riconosciuti, applicato, ho intenzione di eseguire i test come mvn clean test ma tutto quello che ottiene è che:

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

e piuttosto lunga stacktrace.

Non ho qualsiasi indizio che cosa potrebbe essere sbagliato, davvero.

+0

funziona per java 8 anche tu? –

risposta

9

Così, il trucco era di compilare quella biblioteca con i miei aspetti non con javac ma con ajc (aka aspectj-maven-plugin)

Questo è tutto. Ho dovuto aggiungere questo nel modulo esperto di aspetti (sono in src/main/java)

aspetti sono annotazioni cavalcato in modo da dover avere 1.6 origine/destinazione/compliance livello

aspectj MODULO

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

Quello che hai a inserire questo modulo come una dipendenza di prova nel vostro modulo di destinazione che si desidera utilizzare gli aspetti con

TARGET MODULO

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

È necessario utilizzare il livello 1,6 ovunque

+0

grazie amico uomo –

Problemi correlati