Превращение производственного аспекта в тестовый класс с 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();
    }
}

Просто замечание, поскольку я не знаю, чего вы пытаетесь достичь, посоветовав тестовые классы (которые являются компонентами специально только для тестовых случаев): сделайте ваши тесты максимально простыми.

Другие вопросы по тегам