Как сделать манифест доступным во время запуска юнит-теста Maven / Surefire "mvn test"? - PullRequest
9 голосов
/ 26 мая 2010

Как сделать манифест доступным во время запуска тестов Maven / Surefire "mvn test"?

У меня есть проект с открытым исходным кодом, который я конвертирую из Ant в Maven, включая его модульные тесты. Вот репозиторий исходного кода проекта Maven: http://github.com/znerd/logdoc

Мой вопрос относится к основному модулю, называемому «базовым». Этот модуль имеет модульный тест, который проверяет поведение статического метода getVersion() в классе org.znerd.logdoc.Library. Этот метод возвращает:

Library.class.getPackage().getImplementationVersion()

Метод getImplementationVersion() возвращает значение параметра в файле манифеста. Все идет нормально. Я проверял это в прошлом, и он работает хорошо, пока манифест действительно доступен в пути к классам по пути META-INF/MANIFEST.MF (либо в файловой системе, либо внутри файла JAR).

Теперь моя проблема заключается в том, что файл манифеста недоступен при запуске модульных тестов:

mvn test

Surefire запускает модульные тесты, но мой модульный тест не проходит с сообщением, указывающим, что Library.getVersion() вернул null.

Когда я хочу проверить JAR, я обнаруживаю, что он даже не был сгенерирован. Maven / Surefire запускает модульные тесты для классов, за до ресурсы добавляются в путь к классам.

Дальнейшие исследования показывают, что Surefire генерирует свой собственный файл JAR во временном каталоге, например,

/private/var/folders/TR/TREvj1wIHYyAcUy-xmc3UU+++TI/-Tmp-/surefirebooter7448562488934426857.jar

А затем использует этот JAR для загрузки класса Library. Этот JAR-файл не содержит ресурсов, которые я вставил в src/main/resources. Так что помещение файла META-INF/MANIFEST.MF тоже не работает.

Итак, как мне сказать Surefire, чтобы мой файл META-INF/MANIFEST.MF был доступен из того же загрузчика классов, что и класс Library.

Обратите внимание, что я использую Maven 2.2.0, Java 1.6.0_17 в Mac OS X 10.6.2, с JUnit 4.8.1.

1 Ответ

2 голосов
/ 27 мая 2010

Ну, как вы указали, проблема в том, что MANIFEST.MF генерируется во время package и напрямую включается в финальную банку, и все это происходит после test. Поэтому я думаю, вам придется либо:

  • предоставьте свой собственный файл MANIFEST.MF (который будет доступен в target/classes до объединения во время package). Я не знаю, если это вариант (и будет ли он работать).
  • поставить и запустить тест из другого модуля в зависимости от JAR.
...