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
こういうのすぐ忘れるから書いておかないと・・・。