2011-09-27 25 views
6

Oto sytuacja:Ignorując AspectJ podczas testów JUnit

  1. Mamy klasy z określonym aspektem swojego metodaA;
  2. Mamy test JUnit dla tej metodyA;

Po uruchomieniu testu JUnit aktywuje również Aspekt. Wszelkie przemyślenia dotyczące ignorowania aspektów podczas testów jednostkowych?

Mam oddzielne testy dla moich aspektów i działa dobrze. Tak więc w moim teście jednostkowym chcę przetestować tylko metodę A bez żadnych załączonych aspektów.

Używam sprężyny 3.0 i jej obsługa aspectj.

Z góry dziękuję.

Pozdrawiam, Maks

+2

Czy w scenariuszu testowym można użyć oddzielnego kontekstu aplikacji dla tych konkretnych testów, aby można było skomentować obsługę AspectJ z tego kontekstu? –

+0

Dzięki Vladimir, mam aspekt-it-config dla mojego testu IT Aspect, ale nie chcę tworzyć kolejnej wersji dla testu JUnit tylko po to, żeby wyłączyć tkactwo. Wypróbuję rozwiązanie z Espen i zobaczę, jak to działa. – maxx

Odpowiedz

4

można wyłączyć tkania kompilacji, że zakładamy, że robi IDE i używać w czasie ładowania tkania w swoich oddzielnych testów AspectJ.

Aby włączyć tkanie czasu ładowania, należy podać parametr javaagent jako parametr maszyny JVM.

Przykład:

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

Inne zmiany po przeniesieniu z kompilacji załadować-czas tkania

Należy również dostarczyć plik aop.xml w META-INF folder na claspath. Na moim przykładzie śladowego, wygląda to tak:

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

W tej konfiguracji można zobaczyć, że klasa TraceAspect będzie utkany ze wszystkich klas w pakiecie demonstracyjnym.

konfiguracja Wiosna z obciążenia czasu tkania

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

plik konfiguracyjny jest prawie taka sama jak w pliku konfiguracyjnym kompilacji, oprócz tego, że zawiera również element tkacz obciążenia w czasie.

Mam nadzieję, że to pomoże!

+0

Dzięki Espen, da to dzisiaj szansę – maxx

+0

Pomyśl o tym i nie wiem, czy to działa. Klasy A i AspectForClassA do tkania są takie same. Kiedy uruchamiam Aspect IT, potrzebuję tkanie, a także uruchamianie aplikacji. Kiedy uruchamiam JUnit, nie robię tego. Jak więc określić w konfiguracji, że tkanie musi być ignorowane, ale tylko dla testów JUnit – maxx

+0

Powinieneś refakturować swój kod i mieć logikę aspektu w osobnej klasie. Z moją sugestią powyżej domyślnie nie będziesz mieć żadnego tkania. Musisz dostarczyć javaagent jako argument JVM za każdym razem, kiedy go potrzebujesz. Jeśli masz automatyczne tkanie w czasie kompilacji, takie jak plugin Eclipse AJDT, musisz najpierw wyłączyć AspectJ nature w swoim projekcie. – Espen

Powiązane problemy