Использование 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
.