«NoClassDefFoundError» при запуске JUnit 4 из терминала Cygwin - PullRequest
0 голосов
/ 21 января 2019

Ранее я скачал junit-4.12.jar и hamcrest-core-1.3.jar и добавил их в свою Windows CLASSPATH.Когда я хочу запустить тест JUnit, я открываю терминал Cygwin, перехожу в каталог моего класса тестирования и запускаю

$ java org.junit.runner.JUnitCore TestClass

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

Я скомпилировал тестовый класс изTestClass.java, который был предоставлен кем-то другим.Предполагается, что в начале теста будет выдано testThrowsIllegalArgumentException(), но вместо этого я получаю NoClassDefFoundError - если программа каким-то образом провалилась перед самим тестированием - с последующей трассировкой стека:

JUnit version 4.12
Exception in thread "main" java.lang.NoClassDefFoundError: proj/TestClass (wrong name: TestClass)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
        ...
        at org.junit.runner.JUnitCore.runMain(JUnitCore.java:72)
        at org.junit.runner.JUnitCore.main(JUnitCore.java:36)

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

Я просмотрел все остальные часто задаваемые вопросы и ветку StackExchange, которые, на мой взгляд, актуальны, не найдя ответа на мою проблему.Сейчас кажется, что это может быть связано с CLASSPATH.Я попытался добавить каталоги тестового класса и исходного класса, который он тестирует, используя java -cp, но, как и все остальное, он не работал.Буду признателен за любую дополнительную помощь, потому что я сейчас в полном недоумении.

1 Ответ

0 голосов
/ 22 января 2019

После долгих экспериментов я наконец-то решил свою проблему.

Мой проектный каталог изначально предназначался для Eclipse (я рано решил, что лучше не устанавливать Eclipse, если смогу помочь, поэтому, возможно, именно поэтому у меня возникла эта проблема). Он структурирован так:

proj  
| src  
| | main  
| | | java  
| | | | proj  
| | | | | Class.java  
| | | | | Class.class  
| | | | | [other java files]  
| | test  
| | | java  
| | | | proj  
| | | | | TestClass.java  
| | | | | TestClass.class  
| | | | | [other java test files]  
| [other directories]

Кроме того, файлы Class.java и TestClass.java в начале имеют оператор package proj;. Очевидно, это означает, что после компиляции, например, TestClass, мне нужно было ссылаться на него как proj.TestClass из родительского каталога при вызове java в терминале.

Если бы я обращал больше внимания на сообщение об ошибке, я бы увидел, что java специально ожидал proj/TestClass. Из этого ответа на отдельный вопрос :

Аргумент java - это не файл, это полное имя класса внутри classpath (основного класса, который вы хотите выполнить).

Команды Cygwin, которые в итоге заработали:

$ cd proj/src
$ java -cp "$CLASSPATH;main\java;test\java" org.junit.runner.JUnitCore proj.TestClass

Поскольку в конечном итоге я все еще использую Windows, java - это команда Windows, поэтому аргумент -cp необходимо отформатировать в виде списка путей в стиле Windows.

Мой CLASSPATH в Windows: .;%JUNIT_HOME%\junit-4.12.jar;%JUNIT_HOME%\hamcrest-core-1.3.jar

...