2011-09-27 14 views
6

Ecco la situazione:Ignorando AspectJ durante JUnit mette alla prova

  1. Abbiamo classe con aspetto definito al suo Methoda;
  2. Abbiamo il test JUnit per questo metodo;

Quando eseguo JUnit test attiva anche Aspect. Qualche idea su come ignorare gli Aspetti durante i test unitari?

Ho prove separate per i miei Aspetti e funziona perfettamente. Quindi nel mio test unitario voglio testare solo methodA senza aspetti allegati.

Uso la molla 3.0 e il suo supporto aspectj.

Grazie in anticipo.

saluti, Max

+2

È possibile nel proprio scenario di test utilizzare un applicationContext separato per questi test specifici, in modo da poter commentare il supporto AspectJ da questo contesto? –

+0

Grazie a Vladimir, ho l'aspetto-it-config per il mio Aspect IT test, ma non voglio creare un'altra versione per il test di JUnit solo per disattivare la tessitura. Proverò la soluzione di Espen e vedremo come va. – maxx

risposta

4

è possibile disattivare la tessitura in fase di compilazione che presumo il vostro IDE sta facendo e usare load-time tessitura nei test AspectJ separati.

Per abilitare la tessitura a tempo di caricamento è necessario fornire un javaagent come parametro JVM.

Un esempio:

-javaagent:lib/spring-dependencies/spring-agent.jar 

Altre modifiche quando si spostano da tempo di compilazione per caricare tempo tessitura

È inoltre necessario fornire un file aop.xml nel META-INF cartella il claspath. Per il mio esempio di traccia, sembra che questo:

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
     <!-- only weave classes in this package --> 
     <include within="aspects.trace.demo.*" /> 
    </weaver> 
    <aspects> 
     <!-- use only this aspect for weaving --> 
     <aspect name="aspects.trace.TraceAspect" /> 
    </aspects> 
</aspectj> 

In questa configurazione è possibile vedere che la classe TraceAspect sarà tessuta con tutte le classi nel pacchetto demo.

configurazione della sorgente con load-time tessitura

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context   
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <bean id="traceAspect" class="aspects.trace.TraceAspect" 
     factory-method="aspectOf"/> 

    <context:load-time-weaver /> 
</beans> 

Il file di configurazione è quasi lo stesso del file di configurazione della compilazione, tranne che contiene anche un elemento tessitore carico-tempo.

Spero che questo aiuti!

+0

Grazie Espen, ci proveremo oggi – maxx

+0

Ci ho pensato e non sono sicuro che funzioni. La classeA e AspectForClassA per la tessitura sono gli stessi. Quando eseguo Aspect IT ho bisogno di tessere e di eseguire applicazioni. Quando eseguo JUnit, non lo faccio. Quindi, come posso specificare nella configurazione che la tessitura deve essere ignorata, ma solo per i test JUnit – maxx

+0

Devi refactoring il codice e avere la logica di aspetto in una classe separata. Con il mio suggerimento sopra non avrete tessitura di default. Devi fornire javaagent come argomento JVM ogni volta che ne hai bisogno. Se hai una tessitura automatica in fase di compilazione come il plugin AJDT di Eclipse, devi prima disattivare la natura di AspectJ sul tuo progetto. – Espen

Problemi correlati