【问题标题】:Weaving production aspect into test class with Gradle AspectJ使用 Gradle AspectJ 将生产方面编织到测试类中
【发布时间】:2015-04-06 17:19:21
【问题描述】:

我正在使用 Gradle AspectJ 插件将一些生产方面编织到测试 Java 代码中。我本来希望这可以与插件一起使用,但显然情况并非如此: https://github.com/sedubois/gradle-aspectj-poc/tree/dc44f529831a485fcff8f4889dba8098784dddb4

UnsupportedOperationAspect 编织到MainSevice(都在src/main/java 下)有效,但是将同一方面编织到TestService(在src/test/java 下)不起作用。

我是 Groovy、Gradle 和 AspectJ 的新手,不知道是否应该添加一些 testAspectpath 配置或类似配置?

EDIT1:似乎无关,但 iajc 给出警告:

... :compileTestAspect [ant:iajc] [warning] incorrect classpath: [...]\gradle-aspectj-poc\build\resources\main ...

EDIT2:我天真地将这段代码添加到 Gradle 依赖项中:

ajInpath fileTree(dir: "src/test/java")
aspectpath fileTree(dir: "src/test/java")
testAjInpath fileTree(dir: "src/test/java")
testAspectpath fileTree(dir: "src/test/java")

这没有帮助,第一个测试正常,第二个测试像往常一样失败,出现以下新消息:

... :compileAspect [ant:iajc] [warning] build config error: skipping missing, empty or corrupt aspectpath entry: [...]\gradle-aspectj-poc\src\test\java\com\hello\aop\TestService.java [ant:iajc] [warning] build config error: skipping missing, empty or corrupt inpath entry: [...]\gradle-aspectj-poc\src\test\java\com\hello\aop\TestService.java ... :compileTestAspect [ant:iajc] [warning] build config error: skipping missing, empty or corrupt aspectpath entry: [...]\gradle-aspectj-poc\src\test\java\com\hello\aop\TestService.java [ant:iajc] [warning] build config error: skipping missing, empty or corrupt inpath entry: [...]\gradle-aspectj-poc\src\test\java\com\hello\aop\TestService.java [ant:iajc] [warning] incorrect classpath: [...]\gradle-aspectj-poc\build\resources\main ...

【问题讨论】:

    标签: java groovy gradle aspectj


    【解决方案1】:

    默认情况下,插件不会在测试类中编织主要方面——我们根本没有为它设置配置选项。您可以使用以下行自己执行此操作:

    testAspectpath sourceSets.main.output
    

    【讨论】:

    • 你能详细说明这到底是怎么回事吗?塔!
    • 在您的依赖项部分,请参阅github.com/eveoh/gradle-aspectj的文档
    • 非常感谢,这行得通。不知道我之前做了什么让我认为它没有。不幸的是(我对这一切都很陌生),它并没有帮助我编织集成测试。
    • MikeN,您似乎是 gradle-aspectj 的提交者,因此必须对 gradle 尤其是这个插件有更深入的了解。我在stackoverflow.com/questions/38680678/… 询问了关于插件的问题 - 你可以看看吗?
    【解决方案2】:

    没有匹配TestService#serviceMethod()的表达式。

    为了使您的测试用例工作,您需要建议您的服务方法并且(非常重要)方面必须位于 src/test/ 包中。否则编译器不会把它编织进去。

    // located in `src/test/java` 
    
    package com.hello.aop;
    
    @Aspect
    class UnsupportedOperationAspect {
    
        @Before("execution(void com.hello.aop.TestService.serviceMethod(..))")
        public void throwUnsupportedOperationOnMethod1() {
            throw new UnsupportedOperationException();
        }
    }
    

    只是一个旁注,因为我不知道您通过建议测试类(专门用于测试用例的组件)来达到什么目的:让您的测试尽可能简单。

    【讨论】:

    • 对不起,我在重构发布代码时忘记重命名切入点,我修复了它并更新了链接。但是正如您所说,为什么“编译器不会编织”到测试类中?这就是我要解决的问题。我测试的目的是单独测试 生产方面。
    • 所以我想在TestService 测试类上使用生产AopConfig,而不是将测试与其他生产代码混合,而是将其隔离为仅测试该方面所需的最少代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多