spring-boot
junit5

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


概要

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 では


③テストコンフィグファイルの作成

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


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