AspectJ + Junit + Maven – 在测试中识别切入点但NoSuchMethodError:aspectOf()exception抛出

我已经在这里跟踪了几乎所有的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 ,如下所示:

    org.codehaus.mojo aspectj-maven-plugin 1.4    my.package with-aspects   1.6 1.6     test-compile   true       

1)我在没有compile目标,因为我在src/main/java没有类(这是真的,没关系,我知道我在做什么)

2)我有

  org.aspectj aspectjrt 1.7.3   org.aspectj aspectjweaver 1.7.3  

在我的部分中。 关于aspectj的更多信息。

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 。 我想这是来自1.4版本的aspectj-maven-plugin的消息,我真的不知道1.5什么时候会发布以摆脱这个。 哪些版本兼容?

5)我的“代码”看起来像这样:)

 @RunWith(JUnit4.class) public class TestClass() { @Test public void test01(){ } } 

6)我有1.6.0_39 Oracle Java编译器,我用1.6编译所有内容(目标,源代码全部)

因此,方面得到认可,应用,我将执行像mvn clean test这样的mvn clean test但我得到的是:

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

和很长的堆栈跟踪。

我真的没有任何线索可能是错的。

所以,诀窍是使用我的方面编译该库而不是使用javac而是使用ajc (aka aspectj-maven-plugin)

而已。 我只需要将它添加到maven模块中的方面(它们在src / main / java中)

方面是注释,因此您必须具有1.6源/目标/合规级别

ASPECTJ MODULE

     org.codehaus.mojo aspectj-maven-plugin 1.4  1.6 1.6 1.6 true     compile         

您必须将此模块作为测试依赖项添加到您希望使用方面的目标模块中

目标模块

    org.codehaus.mojo aspectj-maven-plugin 1.4    that-artifact mentioned-above   1.6 1.6 1.6     test-compile   true       

你必须到处使用1.6级