12

我在这里关注了几乎所有的 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>部分。没有更多关于方面j。

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)我有 1.6.0_39 Oracle Java 编译器,我正在用 1.6 编译所有东西(目标、源 .. 全部)

因此,在识别、应用方面,我将执行类似的测试,mvn clean test但我得到的只是:

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

和相当长的堆栈跟踪。

我真的不知道可能出了什么问题。

4

1 回答 1

10

所以,诀窍是用我的方面编译那个库,而不是用 javac 而是用ajc(又名 aspectj-maven-plugin)

而已。我只需要将其添加到带有方面的 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 级别

于 2013-07-14T14:19:31.883 回答