Как добавить тестовую банку в качестве библиотеки аспектов в Maven

У меня есть аспект, который я хочу использовать в своих тестовых классах. Я не хочу добавлять его в основную банку, так как он будет использовать тестовые библиотеки, такие как junit и mockito. Несмотря на то, что есть параметр конфигурации, добавляющий aspectLibrary, он всегда добавляет основную банку, нет возможности указать тестовую банку.

Мой плагин aspectj выглядит так:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7</version>
    <configuration>
        <aspectLibraries>
        <aspectLibrary>
            <groupId>aspect.test</groupId>
            <artifactId>general</artifactId>
            <type>jar</type>
        </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
        <phase>process-sources</phase>
        <goals>
            <goal>compile</goal>
            <goal>test-compile</goal>
        </goals>
        </execution>
    </executions>
</plugin>

Я действительно хочу указать test-jar, но это не представляется возможным. Без этого по умолчанию используется банка (очевидно).

Мне также, возможно, придется настроить аспект j-maven-plugin для целей компиляции и тестовой компиляции... но сначала мне нужно знать, как указать тестовую банку. Любые предложения приветствуются.


person Mark Boon    schedule 15.03.2017    source источник
comment
Как я сказал в другом вопросе, где вы задали первый вопрос: вам нужно добавить библиотеку как обычно <dependency>, прежде чем вы сможете ссылаться к нему как <aspectLibrary>. И, может быть, <type>test-jar</type> будет иметь смысл для тестового JAR?   -  person kriegaex    schedule 15.03.2017
comment
Возможно, вы также могли бы объяснить, почему ваши аспекты находятся в тестовом JAR. Они не используются в производстве? У вас действительно есть аспекты, которые применяются только во время теста? Тогда, возможно, вы тестируете другую настройку, чем в реальной жизни, что может быть опасно. Я могу представить себе единственный сценарий, в котором это имело бы смысл, — это если бы аспекты были вплетены только в ваши тесты (возможно, в качестве вспомогательных средств для выполнения тестов), но никогда в рабочий код. Если вы изменяете производственный код только во время тестов, вы искажаете его поведение.   -  person kriegaex    schedule 15.03.2017
comment
Да, они применяются только к тестовому коду. У меня есть несколько аспектов примеси, которые добавляют функциональность в тестовый класс для захвата событий регистрации и предоставляют способ проверки того, произошли ли определенные события регистрации. Поскольку в аспекте есть ссылки на фиктивный фреймворк, я не хочу, чтобы этот аспект находился в основной банке. ‹type›test-jar‹/type› не поддерживается в ‹aspectLibrary›.   -  person Mark Boon    schedule 15.03.2017


Ответы (1)


Прочтите документацию по плагину Maven JAR, глава Как чтобы создать банку, содержащую тестовые классы. В списке два варианта:

  • простой способ: используя тип "test-jar" (здесь не сработает)
  • предпочтительный способ: создать обычный JAR, содержащий только тестовые классы, а затем импортировать его с областью действия «тест»

Мы выберем предпочтительный способ, потому что он решает вашу проблему. Итак, в основном вы делаете следующее:

  • Создайте отдельный модуль для аспектов/классов помощника по тестированию, поместите все под src/main/java, не src/test/java. Плагин AspectJ Maven должен иметь исполнение с <goal>compile</goal> для этого модуля.
  • Добавьте этот модуль в качестве зависимости с областью тестирования везде, где вам нужны тестовые аспекты.
  • Обращайтесь к модулю как к <acpectLibrary> из подключаемого модуля AspectJ Maven, а также будьте осторожны, чтобы использовать только <goal>test-compile</goal> в выполнении вашего подключаемого модуля для этого модуля, чтобы избежать вплетения аспектов в производственный код или получения сообщений об ошибках, поскольку зависимость имеет тестовую область и недоступен для обычной компиляции.

Поскольку я не хочу полностью цитировать здесь 3 POM и несколько классов, я создал небольшой пример проекта GitHub для вас. Просто клонируйте его, проверьте все файлы и их расположение и - будьте счастливы. ;-)

person kriegaex    schedule 15.03.2017