2016-12-28 13 views
15

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

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

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

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

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

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

+0

Какой источник и цель вы указали как конфигурацию в плагине maven-compiler? Также, пожалуйста, разделите трассировку стека для NPE, чтобы быть понятным по поводу ошибки. – nullpointer

+0

К сожалению, добавлена ​​дополнительная информация. Но в основном, NPE был всего лишь симптомом, который привел меня к реальному вопросу, как я буду заниматься испытаниями в целом. – peterp

ответ

9

Поддержка Maven для Java 9 вообще и тесты, в частности, все еще находятся под Развитие - многие вещи работают, но другие не могут. Не видя трассировки стека для NPE, это, конечно, спекуляция, но я предполагаю, что вы ran into this error.

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

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

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

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

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

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

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

+0

Спасибо за разработанный ответ, Николай. Приятно видеть, что обсуждаемая тема. Я проведу тестирование с параметрами 3 и 1, я не знал, что можно добавить экспорт в командной строке. – peterp

+2

Рад, что я мог помочь. Обязательно сообщите об этом, будь то здесь, с почтой или почтой на головоломки. На этом этапе все отзывы, основанные на реальных экспериментах, ценны. – Nicolai

+0

Я определенно буду :) btw: [комментарий Роберта] (http://stackoverflow.com/questions/41366582/where-should-i-put-unit-tests-when-migrating-a-java-8-projecttoto -jigsaw # comment69959520_41370766) ниже также указывает, что вариант 3 может быть способом пойти – peterp

6

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

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

+0

Спасибо, Роберт. Я не рассматривал это как проблему с maven (за исключением того, что NPE не был полезен, конечно), потому что тестовый код фактически не является модульным. Таким образом, даже если код компилируется и переходит в модуль «unnamed», тестирование материала из модуля src не будет работать по желанию. Но читаю [anwer] Николая (http: // stackoverflow.com/a/41367802/1006823) Я понимаю, что это все еще обсуждается. – peterp

+2

FYI: http://maven.apache.org/plugins/maven-compiler-plugin/xref/org/apache/maven/plugin/compiler/TestCompilerMojo.html#L259 показывает вам, что maven-compiler-plugin использует решение 3 из @Nicolai, который был проверен как правильный подход некоторыми разработчиками Jigsaw team –

+0

Я думаю, что у меня было недоразумение - после того, как я нашел время, чтобы глубже изучить вашу ссылку, я заметил, что сейчас это код v3.6.0 (я думал, что это будущая реализация еще не выпущена). Таким образом, AFAICS (не зная о внутренних функциях Maven), похоже, что я должен иметь возможность запускать тесты (без дескриптора модуля) против моих модульных источников (с дескриптором модуля), если бы не этот NPE. Если это так, должно быть возможно создать собственный собственный плагин компилятора, чтобы он работал для тестирования. Каким будет ожидаемое возвращаемое значение getModuleName? – peterp

2

Как уже suggested here, используя обновленную версию Maven-компилятора-плагина: 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> 

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

enter image description here

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

mvn test 

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

 Смежные вопросы

  • Нет связанных вопросов^_^