AspectJ + Junit + Maven — pointcut распознается в тестах, но NoSuchMethodError: выдается исключение аспекта ()

Я следил почти за всеми вопросами 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) Я уверен, что мои классы тестирования признаны аспектом, потому что я вижу, что точки соединения были рекомендованы. Я понимаю:

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) У меня компилятор Oracle Java 1.6.0_39, компилирую все с 1.6 (цель, исходник.. все)

Итак, аспекты распознаны, применены, я собираюсь выполнить такие тесты, как mvn clean test, но все, что я получаю, это следующее:

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

и довольно длинный стек.

На самом деле я понятия не имею, никакого что может быть не так.


person stewenson    schedule 14.07.2013    source источник


Ответы (1)


Итак, хитрость заключалась в том, чтобы скомпилировать эту библиотеку с моими аспектами не с помощью javac, а с помощью ajc (также известного как aspectj-maven-plugin)

Вот и все. Мне просто нужно было добавить это в модуль maven с аспектами (они находятся в src/main/java)

Аспекты основаны на аннотациях, поэтому вам должен соответствовать исходный/целевой/соответствующий уровень 1.6.

АСПЕКТНЫЙ МОДУЛЬ

<!-- 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 везде

person stewenson    schedule 14.07.2013
comment
Старый вопрос, но только для тех, кто все еще борется... Мне пришлось запустить mvn compile, чтобы исправить это в интеллектуальной идее. - person toastedDeli; 10.01.2020