Использование JUnit 5 С Java 9 без Maven или Gradle

Описание:

Я хотел бы создать тест JUnit с помощью JUnit 5 на затмение (кислород 4.7.1 a). Этот тест JUnit должен находиться внутри отдельной папки src под названием Test. Тем не менее, я столкнулся со следующими проблемами, поскольку я новичок в JUnit и Java 9.

Я не хочется использовать инструменты сборки, такие как Gradle или Maven для этого.

Проблема:

как у меня есть два различные папки src, одна для проектов src и одна для тестовых случаев:

  • мне нужно два модуля-информация.файлы java? (по одному для каждой папки src)
  • какие модули требуются в моем модуле-info.java-файл для JUnit 5 для работы?

1 ответов


в общем-то нет необходимости, чтобы модулировать свой тестовый код (по крайней мере я не могу придумать уважительной причины, может быть, кто-то может дать удовлетворительного контр-пример). Только один!-Файл -6--> можете (в конце концов, это даже не требуется, чтобы модулировать свой основной код) присутствовать в основной код под src.

С module-info.java файл будет только в вашем основном исходном каталоге, а не в тестовом исходном каталоге, тогда логически он не должен зависеть от модуля JUnit. Так вопросы теперь становятся тем, как компилировать и запускать тестовые классы JUnit, полагаясь на модуль (который представляет тестируемую систему) и модуль JUnit.

для этого вам нужно будет использовать новые опции, предоставляемые javac и java:

так что если у вас есть следующее дерево:

src
    module-info.java (declares a module called "my.module")
    mypackage
        MyClass.java
test_src
    mypackage
        MyClassTest.java
lib/junit-platform-console-standalone.jar

(Примечание: специально для JUnit 5 можно использовать артефакт junit-platform-console-standalone, содержащий ядро JUnit engine и позволяет запускать тесты в консоли; см. руководство пользователя)

затем вы можете скомпилировать код следующим образом:

cd root_dir
javac -d mods/my.module src/module-info.java src/mypackage/MyClass.java

cd test_src
javac -d test_out --module-path ../mods;../lib/junit-platform-console-standalone.jar \
--add-modules org.junit.platform.console.standalone,my.module --patch-module my.module=. \
--add-reads my.module=org.junit.platform.console.standalone mypackage/MyClass.java

и вы можете запустить скомпилированный тестовый класс:

cd test_src/test_out
java --module-path=../../mods;../../lib/junit-platform-console-standalone.jar \
--add-modules my.module,org.junit.platform.console.standalone \
--add-reads my.module=org.junit.platform.console.standalone \
--patch-module my.module=. \
--add-opens my.module/test=org.junit.platform.console.standalone \ 
org.junit.platform.console.ConsoleLauncher test.MyClassTest

неудобные команды, но это стоимость не используете Maven. Я советую вам прочитать об этих параметрах в командной документации после понимания концепции пути модуля. Важно отметить, что здесь есть пара опции:

--patch-module my.module=.

это необходимо, потому что пример тестового кода имеет тот же пакет (mypackage) как модуль my.module. Без него модульная система будет жаловаться.

--add-reads my.module=org.junit.platform.console.standalone

это делает junit требуется my.module хотя это не было объявлено в module-info.java.

org.junit.platform.console.standalone имя автоматический модуль и является производным от манифеста Jar (как в случае с JUnit 5), в противном случае от имени файла Jar (например, в случай JUnit 4).

также обратите внимание, что это то, что Maven, вероятно, делает за кулисами при компиляции и запуске модульных тестов (см. этот вопрос для эквивалентной конфигурации плагина, которая вручную выполняет вышеуказанное).

что если по каким-то причинам, вы хотите распределить ваш юнит-тесты?

в этом случае, поскольку в приведенном выше примере модульные тесты имеют один и тот же пакет, их можно включить в my.module и добавьте требование к JUnit:

module my.module {
    exports mypackage;
    requires org.junit.platform.console.standalone;
}

если модульные тесты были в другом пакете, вы также можете разделить их на два модуля (два module-info.java), a my.module и a my.test.module где только последний требует JUnit.

если вы включаете тестовые классы в модуль, то в приведенных выше командах вам не нужно --add-reads и --patch-module.