https://softwarecampament.wordpress.com/portsadapters/

ние:

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

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

Проблема:

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

Нужны ли мне два файла module-info.java? (по одному на каждую папку src)Какие модули требуются в моем файле module-info.java для работы JUnit 5?
 Naman12 окт. 2017 г., 09:01
Также будет ждать @AlanBateman, чтобы пролить свет на контекст ...Я надеюсь, что со временем появится поддержка инструментов, плагинов, тестовых исполнителей ... Так что обычные разработчики не должны беспокоиться об этом. Может быть, я пропустил эту тему вообще из моих писем.
 Joop Eggen11 окт. 2017 г., 22:26
guides.gradle.org/building-java-9-modules Но я могу это понять; module-info.java должен быть в корне. И junit часто полагается на видимость пакета для доступа к классу. Я все еще не сталкивался с проектом java 9 с тестами junit.
 ShadowDragon11 окт. 2017 г., 22:09
Да, я мог бы использовать Maven, но я больше привык к Gradle. Думаю, я хочу попробовать это без Gradle, так как я хотел бы знать, как это работает без таких инструментов сборки.
 Joop Eggen11 окт. 2017 г., 22:06
специалист (инструмент сборки) используетsrc/main/java/ а такжеsrc/test/java/ так что вы можете попробовать это в проекте maven - следуя новым «лучшим практикам». Это действительно вопросstackoverflow.com/questions/41366582/...
 Naman12 окт. 2017 г., 06:51
Возможный дубликатГде я должен поставить модульные тесты при переносе проекта Java 8 в Jigsaw? ? Решение, предложенное Николаем, не даст вам покоя. Также не уверен, почему именно Junit5 для этого вопроса помечен, но структура должна быть аналогичной для любого вида модульных тестов.

Ответы на вопрос(2)

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

В моем случае я собираюсь сделать это, используя Jaba 9 без Maven тоже.

Вот моя статья о гексагональной архитектуре:

https://softwarecampament.wordpress.com/portsadapters/

Решение Вопроса

(по крайней мере, я не могу придумать вескую причину, может быть, кто-то может привести удовлетворительный контрпример). Единственныйmodule-info.java файл может (в конце концов, даже не требуется модулировать ваш основной код) присутствовать в вашем основном коде в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 и позволяет запускать тесты в консоли; см.руководство пользователя)

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

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

Это делает джунит необходимым для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),my.module иmy.test.module где только последний требует JUnit.

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

 Naman12 окт. 2017 г., 04:07
(1) Это, похоже, не имеет отношения к junit5. (2)это не должно зависеть от модуля JUnit, Почему?
 manouti12 окт. 2017 г., 05:45
@nullpointer Я обновил заметку об автоматических модулях относительно JUnit 5. Для зависимости, если тестовый код и основной модуль отделены, зачем основному модулю требуется JUnit. Ключевое слово 'require' подразумевает, что оно необходимо классам в модуле.
 manouti12 окт. 2017 г., 09:07
@nullpointer Достаточно справедливо. И я никогда не говорил, что тесты не должны быть частью модуля :) Просто я не могу придумать вескую причину, по которой кто-то будет это делать, поэтому нет причин указывать на мое «отсутствие необходимости в модульной проверке». заявление.
 Michael Easter12 окт. 2017 г., 02:11
В последнем пункте, у джунита естьAutomatic-Module-Name атрибут в манифесте jar (т.е. это не имя файла) -github.com/junit-team/junit5/commit/...
 manouti12 окт. 2017 г., 05:40
@MichaelEaster Мой плохой, я пробовал этот пример с использованием JUnit 4 и забыл о контексте этого вопроса. Обновил сейчас, спасибо за исправление.

Ваш ответ на вопрос