Подтвердить что ты не робот

Где я должен поставить модульные тесты при переносе проекта Java 8 на Jigsaw

В настоящее время я тестирую перенос приложения Java 8 на Java 9/Jigsaw, используя jdk-9 + 149.

Проект был выложен в стандартном макете каталога Maven, т.е. имеет src/main/java, src/test/java и т.д.

Как только я добавлю module-info.java в src/main/java, maven-компилятор-плагин не запускает исключение NullPointerException. Это связано с тем, что он ожидает найти информацию о модуле для каталога test. Итак, насколько я могу судить, варианты:

  • сохранить тестовые классы в отдельном модуле, что означает, что они могут получить доступ только к экспортированным пакетам основного модуля.
  • переместить тестовые классы в основной модуль вместе с источниками, что означает, что основному модулю нужны тестовые зависимости.

Очевидно, что ни один из этих вариантов не представляется желательным, поэтому я предполагаю, что рекомендуется использовать модули Jigsaw в проекте Maven. Неохотно я не мог найти рекомендаций и примеров.

EDIT: добавление некоторой информации, которую я не учитывал при публикации вопроса (извините)

4b9b3361

Ответ 1

Поддержка Maven для Java 9 в целом и тесты, в частности, все еще находятся в стадии разработки - многие вещи работают, но другие могут не работать. Без просмотра трассировки стека для NPE это, конечно, спекуляция, но я предполагаю, что вы столкнулись с этой ошибкой.

В более общем плане вопрос о том, как точно будут тестироваться единичные тесты с Jigsaw, еще обсуждается - даже в списке рассылки Jigsaw.

Вот мое мнение по этому вопросу:

  • Как вы отмечаете, сдача тестов в отдельный модуль означает, что только публичные типы в экспортированных пакетах будут проверяться, что определенно недостаточно. Могут быть обходные пути, но для этого требуется либо отредактировать объявление модуля (исходный код, module-info.java), либо дескриптор (байт-код, module-info.class) на лету или добавить тонну флагов командной строки --add-exports в javac и java, компилируя и запуская тесты. Ничего из этого не звучит особенно забавно, особенно если вы хотите сделать это вручную.

  • Перемещение тестов в исходное дерево - плохая идея по очевидным причинам, не в последнюю очередь среди них, что создание JAR без тестов потребует много времени.

  • Другой вариант - использовать параметр --patch-module, который позволяет добавлять class файлы или содержимое JAR в существующий модуль. Таким образом, шаг testCompile может создать JAR, содержащий исходные и тестовые файлы. К сожалению, если он не манипулирует объявлением/описанием модуля, как описано выше, результирующий JAR не может быть выполнен без добавления границ чтения с java --add-reads для тестовых зависимостей. Тем не менее, лучше, чем выше.

  • В качестве крайней меры существуют способы, чтобы JAR обрабатывался как обычный JAR, а не как модуль. Проще всего было бы свалить его на путь класса вместе с тестовым JAR. Таким образом, все работает так же, как в Java < 9. К сожалению, это сломает код, который использует функции в предположении, что он находится в именованном модуле (например, некоторые виды взаимодействий с API отражения).

Лично я считаю, что 3. лучший из вышеперечисленных вариантов. Это не потребует изменений в макете проекта и только сравнительно незначительных добавлений к командам javac и java.

Ответ 2

Вы должны хотя бы использовать maven-compiler-plugin 3.6.0 для поддержки головоломки. Однако, поскольку build +148 бинарная структура файла класса изменилась, поэтому плагин не может извлечь имя модуля по-прежнему (имя модуля должно быть в состоянии скомпилировать тесты). Я работаю над исправлением для этого, но я, вероятно, полагаюсь на новую версию ASM.

UPDATE: maven-compiler-plugin-3.6.1 был выпущен, поэтому поддержка головоломки восстанавливается.

Ответ 3

Как уже говорилось , используя обновленную версию модуля maven-compiler-plugin: 3.7.0 поможет вам исправить это: -

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
            <source>9</source>
            <target>9</target>
            <compilerArgument>-Xlint:all</compilerArgument>
        </configuration>
     </plugin>
</plugins>

Где вы можете поместить свои модульные тесты в тот же каталог, что и раньше, до модуляции. Вот образец проекта от меня, который основан на JDK9 и Maven3+. Проект следует структуре каталогов, как показано на снимке экрана: -

введите описание изображения здесь

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

mvn test

из корневого каталога проекта, чтобы найти тесты, будет выполняться как обычно.