SpringBootのテストをJUnit4からJUnit5に移行する際の注意点

Pocket

SpringBootのテストプログラムをJUnit4で作成していましたが、JUnit5+AssertJに変更しました。

移行の際に手間取った箇所について、絶対に忘れるので備忘。

(1)ライブラリ
(2)テストクラス
(3)テストメソッド(@Before)

(1)ライブラリ
 Mavenならpom.xml、Gradleならbuild.gradleに記述する内容です。
 JUnit4のライブラリが残っていると、同名のアノテーション(@Test)を間違ってJUnit4の方でimportしてしまい、うまくテストが動かないというミスを呼びます。3時間ほど使ってしまった。。。

 というわけで対応策として、あらかじめJUnit4のライブラリを消しておきましょう。spring-boot-starter-testからjunitやjunit-vintageを除外します。
  build.gradleならこんな感じ。

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module:'junit'
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

 JUnit5は複数のライブラリで構成されますが、junit-vintageを入れてしまうとやっぱりJUnit4用のアノテーションを間違ってimportしてしまうので、必要なければ記述しない方が安全かなと思いました。
 とりあえず以下3点を適用。

    testImplementation 'org.junit.platform:junit-platform-surefire-provider:1.3.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'

あとは必要に応じて、spring-security-testやassertj-coreなどを記述。

(2)テストクラス
 次にテストクラスのアノテーションですが、最低限以下は必要かと思います。MockMVCでテストすることを想定しています。

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class 〇〇Test {

ここで注意したいのが、JUnit4環境ではテストランナーを「@RunWith(SpringRunner.class)」としていましたが、「@ExtendWith(SpringExtension.class)」とする必要がある点です。

@SpringBootTestと@AutoConfigureMockMvcはJUnit4の時と変わりません。

(3)テストメソッド(@Before)
 各テストメソッドが実行される前に実行したいメソッド(前処理など)には「@Before」を付与していました。これがJUnit5では「@BeforeEach」になります。
 ちなみに@BeforeAllはstaticメソッドになるので、staticフィールドに@Autowiredできないことに注意しましょう。

私はFlywayでDBマイグレーションを行っており、DBSetUpでDBテストを行っているので以下のアノテーションも追加しています。GitHubのflyway-test-extensionsのReadmeに使用方法などが書いてあります。

@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, FlywayTestExecutionListener.class })
@FlywayTest
@Transactional

こういうのすぐ忘れるから書いておかないと・・・。

広告

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です