在IntelliJ的单元测试期间,自动进行AspectJ失败

时间:2016-02-19 16:32:05

标签: maven intellij-idea junit aspectj

我们有一系列的单元测试,在我尝试为依赖注入添加一些方面并记录在我们的休息端点调用的方法的持续时间之前,它们正在通过。

在测试失败之前的单元测试中,我们得到两个奇怪的错误:

[AppClassLoader@14dad5dc] error aspect 'com.lutherconsulting.aphirm.log.DurationLoggingAspect' woven into 'com.lutherconsulting.aphirm.rest.ClientRest' must be defined to the weaver (placed on the aspectpath, or defined in an aop.xml file if using LTW).

[AppClassLoader@14dad5dc] error aspect 'com.lutherconsulting.aphirm.log.DurationLoggingAspect' woven into 'com.lutherconsulting.aphirm.log.DurationLoggingAspect' must be defined to the weaver (placed on the aspectpath, or defined in an aop.xml file if using LTW).

我们正在使用aspectj maven插件让它将方面自动传送到Web应用程序中。我们的Maven的pom.xml配置如下。

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.8</version>
            <configuration>
                <showWeaveInfo>true</showWeaveInfo>
                <complianceLevel>1.8</complianceLevel>
                <source>1.8</source>
                <target>1.8</target>
                <Xlint>ignore</Xlint>
                <encoding>UTF-8</encoding>
                <verbose>true</verbose>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>test-compile</goal>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

奇怪的是,如果我构建war文件并将其部署到Tomcat实例,或者如果我运行所有的黄瓜功能测试,这一切都可以正常工作。当我执行其中任何一个时,方面编织很好,我得到有关我注释的其余方法的持续时间的数据正确记录到数据库。如果我从intelliJ运行一个特定的测试包或尝试在intellij中运行所有junit测试,那么它会因这两个错误而失败

这是我在Intellij中作为执行单元测试的运行/调试配置中缺少的东西吗?我不认为我们的应用程序结构与任何普通的Web应用程序不同

- src
   | - main
      | - java
         | - packages
      | - resources
   | - test
      | - java
         | - packages
      | - resources
- pom.xml

我很欣赏

上的任何想法

2 个答案:

答案 0 :(得分:1)

最后,最终解决这个问题的方法是进入IntelliJ的项目结构,在AspectJ设置上有一个Post-Compile Weave Mode复选框。检查这一点确保在测试执行之前在Intellij中发生了编织。

答案 1 :(得分:0)

据我了解,您使用自己的跑步者而不是maven从IntelliJ运行测试。

因此,您已配置weaver通过aspectj-maven-plugin使用maven运行。问题是你的IntelliJ运行器没有运行maven,因此它的weaver插件也没有运行。

我可以提出一个想法,你可以在IntelliJ中运行你的maven测试目标,用maven配置运行你所有的测试,所以它会检测aspectj-maven-plugin并运行weaver。在这里,您可以查看如何运行maven目标: https://www.jetbrains.com/idea/help/executing-maven-goal.html

另一方面,根据此链接,您必须在IntelliJ中启用加载时间编织 http://www.aspectprogrammer.org/blogs/adrian/2006/02/a_practical_gui_2.html

引用它所说的链接:

  

打开&#34;运行/调试配置&#34;使用下拉列表中的对话框   工具栏。点击&#34; +&#34;用于创建新配置并为其命名的图标   例如&#34;测试&#34;

     

对于这个项目,我已选择&#34;所有包装&#34;并搜索测试   &#34;在整个项目&#34;。

     

现在您要做的就是添加引入的VM启动参数   AspectJ LTW代理:

     

-javaagent:lib / aspectjweaver.jar

     

&#34;之后的部分:&#34;应该是您的aspectjweaver.jar副本的路径。在这种情况下,我已经复制了   aspectjweaver.jar从Spring分发到lib目录   我的项目(它不需要在项目的类路径上)。您   如果你愿意,也可以使用AspectJ 5最终版本的jar。

此外,您可以检查配置AspectJ facet,检查此链接以阅读它 https://www.jetbrains.com/idea/help/aspectj.html