当前位置: 首页 > 面试题库 >

AspectJ + Junit + Maven-测试中识别出切入点,但抛出NoSuchMethodError:AspectOf()异常

鲜于光赫
2023-03-14
问题内容

我在这里关注了几乎所有的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>部分 关于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。我想这是来自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;

和相当长的stacktrace。

我没有 任何 东西可能是错误的线索,真的。


问题答案:

所以,诀窍是用我的方面而不是javac而是ajc(aka 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级



 类似资料:
  • 由于一个我不知道的事件,调用在我的Ubuntu18.04中不再起作用。(自4月开始运行)。或I阶段尝试的任何其他生命周期都运行良好。 例如,如果我在克隆到中的Apache Commons IO的最新版本中运行,If显示 target/surefire-reports包含以下内容的许多重复 我尝试的任何其他项目都表现出类似的行为。 我尝试下载maven 3.5.4,解压缩它,通过将它添加到路径中,并

  • 问题内容: 我对JUnit还是很陌生,我真的不知道对于异常和异常处理有什么最佳实践。 例如,假设我正在为IPAddress类编写测试。它具有一个构造函数IPAddress(String addr),如果addr为null,则将抛出InvalidIPAddressException。据我可以从谷歌搜索中得知,对null参数的测试将如下所示。 在这种情况下,try / catch很有意义,因为我知道异

  • 我正试图为一个方法编写一个测试用例,该方法基于特定的逻辑抛出异常。然而,测试用例失败了,因为预期的异常和获得的异常是不同的。 我如何解决这个问题?

  • 我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?

  • 我们的项目结构如下: 相关的JUnit测试位于A-A中。在使用Maven之前,我们必须调整Eclipse中的运行配置(将arguments选项卡中的工作目录设置为A-B,启动应用程序),以便在没有错误的情况下启动所有测试。 现在,当我们尝试运行测试时,无论我们是否在Eclipse中运行测试,我们都会从a-a中的类中得到一个 我的猜测是我们有一个错误的配置的POM和Surefire不能找到所有的类文

  • 问题内容: 嗨,有一个针对车辆构造函数的测试。该测试会在没有驾驶执照的情况下使用驾驶员对车辆进行初始化,并且应该抛出异常。代码构造函数: 代码测试: 当我运行此重点测试方法时,这就是结果。 -------------标准输出--------------- 吉恩正确的rijbewijs 因此,根据输出,捕获并显示了异常,但测试失败。有人知道为什么吗?提前致谢。 编辑:我通过不包括try-catch块