JUnitのテストで嵌ったパス指定


はじめに

今回、Javaでの開発中にテストを行うため、テストクラスを作成しました。
そして、JUnitCoreの実行を行う際にパス指定を行うのですが、記述方法で躓いたのでまとめておこうと思います。

~注意~
開発環境や Shell などの違いで予想と異なる結果の場合があるかもしれません。
下記環境を参照.

環境

  • macOS 11.0.1
  • JDK 11.0.10
  • JUnit 4.13.2
  • vscode 1.54.3

前提条件

Javaプロジェクトの構成

Javaプロジェクトの src 直下に移動
注意:上記のプロジェクト構成の場合

cd ~/Workspace/Java/Project/src 

問題点

下記を実行するとエラーが出力される。

java -cp ../lib/junit-4.13.2.jar:../lib/hamcrest-core-1.3.jar: org.junit.runner.JUnitCore com/test/MainTest

コンパイルの段階ではパスは通っていたのだけれど...
詳しい原因はわからないが、おそらく、Could not find class [com/test/MainTest] が問題だと思われる。

JUnit version 4.13.2
.E
Time: 0.002
There was 1 failure:
1) initializationError(org.junit.runner.JUnitCommandLineParseResult)
java.lang.IllegalArgumentException: Could not find class [com/test/MainTest]
        at org.junit.runner.JUnitCommandLineParseResult.parseParameters(JUnitCommandLineParseResult.java:100)
        at org.junit.runner.JUnitCommandLineParseResult.parseArgs(JUnitCommandLineParseResult.java:50)
        at org.junit.runner.JUnitCommandLineParseResult.parse(JUnitCommandLineParseResult.java:44)
        at org.junit.runner.JUnitCore.runMain(JUnitCore.java:72)
        at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
Caused by: java.lang.ClassNotFoundException: com/test/MainTest
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at org.junit.internal.Classes.getClass(Classes.java:42)
        at org.junit.internal.Classes.getClass(Classes.java:27)
        at org.junit.runner.JUnitCommandLineParseResult.parseParameters(JUnitCommandLineParseResult.java:98)
        ... 4 more

FAILURES!!!
Tests run: 1,  Failures: 1

解決方法

MainTestクラスをパスを指定する際、以下のように/で区切ることもできるが、
JUnitCore の実行を行う際は、com.test.MainTest のように.で区切る必要がある。

また、junit-4.13.2.jarhamcrest-core-1.3.jarの間の:の左右にスペースはいれてはいけない。
もし入れていた場合はエラーとなるためエラーが出た場合は確認してほしい。

  • 失敗例
java -cp ../lib/junit-4.13.2.jar:../lib/hamcrest-core-1.3.jar: org.junit.runner.JUnitCore com/test/MainTest
  • 成功例
java -cp ../lib/junit-4.13.2.jar:../lib/hamcrest-core-1.3.jar: org.junit.runner.JUnitCore com.test.MainTest

成功例では以下のように示される。

JUnit version 4.13.2
.
Time: 0.007

OK (1 test)

JUnitCore の実行時に.jarを分けて記述したため冗長になったが、下記のようにワイルドカードを使うことで、簡略化して記述できる。

java -cp ../lib/*.jar: org.junit.runner.JUnitCore com.test.MainTest

さいごに

今回は意外なところで嵌ってしまったので、よい勉強になりました。
ネット上で検索しても解決方法がなかなか見つからなかったので、苦労しました。
けれど、同じようなことで解決できていない方の助けになれば幸いです。

最近は、vscode を使って Java 開発をしているのですが、Eclipse などの IDE と違って細かな違いに慣れるのに苦労しています。