AspectJ + Junit + Maven - pointcut распознается в тестах, но генерируется исключение NoSuchMethodError: aspectOf()
Я следил почти за всеми вопросами JUnit + Maven + AspectJ здесь, и даже я уверен, что все настроено правильно, я не могу проверить это.
У меня есть модуль 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
,
Теперь я использую aspectj-maven-plugin
в моем <build>
как это:
<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) у меня нет compile
цель в <execution>
потому что у меня нет занятий в src/main/java
(это правда, и это нормально, я знаю, что я делаю)
2) у меня есть
<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>
в моем <dependencies>
раздел. Ничего более в отношении аспекта.
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.7.3 вместо 1.6.11, мне показалось это сообщение во время обработки точек соединения: expected 1.6.11 found 1.7.3
, Я думаю, это сообщение от aspectj-maven-plugin
версии 1.4, я не знаю, когда выйдет 1.5, чтобы избавиться от этого. Какие версии совместимы?
5) Мой "код" выглядит так:)
@RunWith(JUnit4.class)
public class TestClass() {
@Test
public void test01(){
}
}
6) У меня есть Java.0 компилятор 1.6.0_39, я компилирую все с 1.6 (цель, источник.. все)
Итак, аспекты признаны, применены, я собираюсь выполнить такие тесты, как mvn clean test
но все, что я получаю, это:
java.lang.NoSuchMethodError:
my/aspect/AssertionAspect.aspectOf()Lmy/aspect/AssertionAspect;
и довольно длинная трассировка стека.
Я понятия не имею, что может быть не так, правда.
1 ответ
Итак, задача была в том, чтобы скомпилировать эту библиотеку с моими аспектами не с помощью Javac, а с ajc
(иначе аспект-maven-плагин)
Вот и все. Мне просто нужно было добавить это в модуль maven с аспектами (они находятся в src/main/java)
Аспекты содержат аннотации, поэтому вы должны иметь уровень 1.6 источник / цель / соответствие
ASPECTJ МОДУЛЬ
<!-- 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 везде