Совместное использование тестового кода в Maven
Как вы можете зависеть от тестового кода из другого модуля в Maven?
Например, у меня есть 2 модуля:
- База
- Главный
Я хотел бы, чтобы контрольный пример в Main расширял базовый тестовый класс в Base. Это возможно?
Обновление: нашел приемлемый ответ, который предполагает создание тестовой банки.
5 ответов
Я рекомендую использовать тип вместо классификатора (см. Также: классификатор). Он рассказывает Maven немного более четко, что вы делаете (и я обнаружил, что m2eclipse и q4e оба нравятся больше).
<dependency>
<groupId>com.myco.app</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
Спасибо за предложение базового модуля. Однако я бы не стал создавать новый модуль именно для этой цели.
Нашел приемлемый ответ в документации по Surefire Maven и в блоге. Смотрите также " Как создать банку с тестовыми классами".
Это создает JAR-файл кода из src/test/java
используя плагин jar, чтобы модули с тестами могли делиться кодом.
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Чтобы использовать прикрепленный тестовый JAR, созданный выше, вы просто указываете зависимость от основного артефакта с указанным классификатором тестов:
<project>
...
<dependencies>
<dependency>
<groupId>com.myco.app</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
Мы решили эту проблему, создав проект maven с тестовым кодом в виде src/main/java и добавив следующую зависимость к проектам:
<dependency>
<groupId>foo</groupId>
<artifactId>test-base</artifactId>
<version>1</version>
<scope>test</scope>
</dependency>
Работал для меня для 1 проекта, но я не работал для другого, выполнив точно такие же шаги.
Итак, я отладил:
- После чистой установки mvn я проверил каталог /target: .jar был там, так что это хорошо
- Запустил mvn dependency:tree в проекте, который должен использовать эти тестовые классы. Заметил, что сгенерированный файл jar с тестовыми классами помечен как зависимость, так что это хорошо.
- Вывод мог быть только один — я перезапустил свой Intellj . В первом классе импорт еще не был виден, но через минуту стал его видеть!
Примечание. Я только перезапустил Intelj, без удаления кешей и т. Д.
Да... просто включите базовый модуль в качестве зависимости в Main. Если вы наследуете только тестовый код, то вы можете использовать тег scope, чтобы Maven не включал код в ваш артефакт при развертывании. Примерно так должно работать:
<dependency>
<groupId>BaseGroup</groupId>
<artifactId>Base</artifactId>
<version>0.1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>