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