Testing the Web Layer のコードを JUnit Jupiter にマイグレーションしてみる
   2 min read

概要

(追記: ここで試したのは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 のみ)。

参考

変更手順

詳しくは冒頭に記載した Git リポジトリ参照のこと。

  1. spring-boot-starter-testjunit(JUnit4)に依存しているので除外する。 (差分リンク)
  2. JUnit5 関連の依存関係を追加設定する。 junit-jupiter-engine, junit-jupiter-api (差分リンク)
  3. テストクラスに付与されているアノテーション @RunWith(SpringRunner.class)@ExtendWith(SpringExtension.class) に置換する。 (差分リンク)
  4. @RunWith(SpringRunner.class) を単に削除する。
    • @ExtendWith(SpringExtension.class)@SpringBootTest@WebMvcTest に含まれるため明示的な設定は不要。
  5. 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 では

③ テストコンフィグファイルの作成
これが重要でした。個々のテストクラスで、コンポーネントスキャンしてクラスを参照できるようにしてあげます。

と書かれているが、今回無くても動作した。