使用 Gradle AspectJ 将生产方面编织到测试 class 中

Weaving production aspect into test class with Gradle AspectJ

我正在使用 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 ...

没有表达式匹配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();
    }
}

只是一个旁注,因为我不知道你想通过建议 test-类(那些专门用于测试用例的组件)来实现什么:让你的测试尽可能简单。

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

testAspectpath sourceSets.main.output