現象
こちらの拙記事で、RESTfulAPIのUnitテストを作った。
IntelliJ上での実行は問題なかった。
ところが、コマンドmvn test
すると、テストが空になってしまっている。
$ mvn clean test
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
これは困った。最終的にはCIツールで動かすことが目的だからだ。
ということで、ググりまくりました。
参考ページ
-
JUnit Setup Maven – JUnit 4 and JUnit 5
https://www.journaldev.com/21711/junit-setup-maven- JUnit4と5の違いを明記してあって分かりやすかった。
- そしてたぶん、
additionalClasspathElements
が必要だったっぽい。- なぜなら、テストクラスは、
src/test/java/
下に置いていたから。(なんだデフォルトで見てくれないのか!?)
- なぜなら、テストクラスは、
-
JUnit 5 ユーザガイドの日本語訳
https://udzuki.jp/public/junit5-user-guide-ja/- 特に、2.3. JUnit Jupiter サンプルプロジェクトの項にあるサンプルプロジェクトが参考になりました。
結論
最終的に、pom.xml
を以下のようにして、無事、コマンドでも通るようになりました。
(IntelliJ上からの実行にも問題ありません)
もしかしたら、不要なものもあるかもしれません。
2020/03/13追記
不要と判明した、以下二つの依存記述について、削除しました。
- junit-platform-surefire-provider
- junit-platform-runner
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>simple-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-webapp</name>
<build>
<finalName>simple-webapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<inherited>true</inherited>
<configuration>
<source>11</source> <!-- ここ -->
<target>11</target> <!-- ここ -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>src/test/java/</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-binding</artifactId>
<version>${jersey.version}</version>
</dependency>
<!-- JAXBはJDK9から外されました -->
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
<!-- テスト -->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.test-framework.providers/jersey-test-framework-provider-grizzly2 -->
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>2.30.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<jersey.version>2.30.1</jersey.version>
<junit.jupiter.version>5.6.0</junit.jupiter.version>
<junit.platform.version>1.3.2</junit.platform.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
これで、
$ mvn clean test
(省略)
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.524 s
[INFO] Finished at: 2020-03-11T00:01:17+09:00
[INFO] ------------------------------------------------------------------------
やったね!
結果をHTMLに出す
どうせならテスト結果を見やすくしようと思って、以下のページを参考に設定しました。
- MavenでJUnitテストレポートを出力する
https://qiita.com/unhurried/items/b10d4597d62dea1b3a94
pomに<report>
タグを書くやり方の紹介もいくつかあったのですが、その方法では出来ませんでした・・・
上記ページの通りにpom.xml
に追記して、上記ページ通りのコマンドを実行すると、下図のようなhtmlが作成されました。
Gradleの出してくれるレポートに慣れているので、ちょっと見づらいな・・・(汗)
Gradleなら特別な設定は不要でhtmlも吐いてくれるのにな。
Gradleなら・・・(大人の事情に涙)
現場からは以上です。