概要
(追記: ここで試したのは2.1.4.RELEASE
時点のもの。2.2.0.M3
以降では #14736の通り JUnit5 がデフォルトになっている模様。)
spring-boot-starter-test の JUnit5 対応はこちらの issue:
現時点でいわゆる out-of-the-box では使えない。手を入れる必要がある。
そこで試しにTesting the Web Layer のサンプルコードを JUnit4 から JUnit Jupiter に変更してみた(Maven 用の pom.xml
のみ)。
参考
- Testing the Web Layer - Spring project’s guides
- SpringExtension for JUnit Jupiter - Spring Famework Testing
- Testing Spring Boot Applications - Spring Boot reference
- Provide dedicated Spring Boot starter for JUnit 5 #14716 - Spring Boot Issues
- Configuring Test Engines - JUnit 5 official guide
変更手順
詳しくは冒頭に記載した Git リポジトリ参照のこと。
spring-boot-starter-test
がjunit
(JUnit4)に依存しているので除外する。 (差分リンク)- JUnit5 関連の依存関係を追加設定する。
junit-jupiter-engine
,junit-jupiter-api
(差分リンク) テストクラスに付与されているアノテーション(差分リンク)@RunWith(SpringRunner.class)
を@ExtendWith(SpringExtension.class)
に置換する。@RunWith(SpringRunner.class)
を単に削除する。@ExtendWith(SpringExtension.class)
は@SpringBootTest
や@WebMvcTest
に含まれるため明示的な設定は不要。
- JUnit4 の
import
を JUnit Jupiter のものに置換する。(差分は上のものに含まれる)
備考
Hamcrest vs AssertJ
からは、 Spring Boot では AssertJ を使うことが推奨されているように感じる。ただし、
にあるとおり、 現時点では MockMvc が Hamcrest に依存しているので完全には Hamcrest を除外できない。
@ExtendWith(SpringExtension.class)
Spring Boot + JUnit5 + Kotlin でテストを書く - Qiita などでは本アノテーションを付与する旨記載されているが、Spring Boot のテストに用いるアノテーションには既に設定されているため、自分(テストコード記述者)が明示的に設定する必要は(もはや)ない。
46.3 Testing Spring Boot Applications - Spring Boot リファレンス:
If you are using JUnit 5, there’s no need to add the equivalent @ExtendWith(SpringExtension.class) as @SpringBootTest and the other @…Test annotations are already annotated with it.
及び関連する issue:
コンポーネントスキャン
SpringBoot と JUnit5 で MockMvc を使うには - Qiita では
③ テストコンフィグファイルの作成
これが重要でした。個々のテストクラスで、コンポーネントスキャンしてクラスを参照できるようにしてあげます。
と書かれているが、今回無くても動作した。