Превращение производственного аспекта в тестовый класс с 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
...
РЕДАКТИРОВАТЬ 2: Я наивно добавил этот код в зависимости 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
...
2 ответа
По умолчанию плагин не учитывает основные аспекты тестовых классов - мы просто никогда не делали опцию конфигурации для него. Вы можете сделать это самостоятельно, используя следующую строку:
testAspectpath sourceSets.main.output
Нет совпадения выражений 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();
}
}
Просто замечание, поскольку я не знаю, чего вы пытаетесь достичь, посоветовав тестовые классы (которые являются компонентами специально только для тестовых случаев): сделайте ваши тесты максимально простыми.