2020年1月現在、JUnit4からJUnit5への過渡期の中でその両者が混合しているようなソースコードはそれなりにあるかと思います。
もしくは今後リファクタリングの際に4から5へアップグレードする必要があるかもしれません。
しっかりお金がもらえて時間があるなら一から作り直すのもありですが、世の中そんなに上手くいくことの方が少ないです。
なので今回はJUnit5で廃止されてしまった@Rule
を場当たり的に応急処置としてとりあえず対応するための方法をご紹介します。
その前に
JUnit5のドキュメントには「今後JUnit5で新しい拡張機能を開発する場合は、JUnit4の@Rule
ではなく、JUnit JupiterのExtension Model
を使ってね。」と書いてあります。
However, if you intend to develop a new extension for JUnit 5 please use the new extension model of JUnit Jupiter instead of the rule-based model of JUnit 4.
なので間違ってもこれから記載する方法でJUnit4の@Rule
をずっと使い続けて良いわけではないので、その点は注意してください。
方法
まずはjuint-jupiter-migrationsupport
を入れます。
testImplementation("org.junit.jupiter:junit-jupiter-migrationsupport:5.5.2")
そうしたら@Rule
を使用しているクラスに@EnableRuleMigrationSupport
アノテーションを付けます。
@EnableRuleMigrationSupport
class OldJunit4Tests {
@get:Rule
val tempDir = TemporaryFolder()
@Test
fun `TemporaryFolderを使うテスト`() {
// doSomeThing
}
}
以上です。
TemporaryFolder
ぐらいだったら@TempDir
が追加されたのでそちらを使用すれば良いのですが、プロジェクトの都合上Ruleを大量に定義していた場合などはこの方法で乗り切ると良いでしょう。
おまけ
JUnit5では@Ignore
がなくなり、代わりにそれと似た機能を持つ@Disabled
が使用されるようになりました。
そちらも似たような方法で対処が可能です。
@Rule
の時と同様にjuint-jupiter-migrationsupport
を入れ、@ExtendWith(IgnoreCondition.class)
または@EnableJUnit4MigrationSupport
を使用します。
// @ExtendWith(IgnoreCondition.class)
@EnableJUnit4MigrationSupport
class OldJunit4Tests {
@get:Ignore
@Test
fun `testWillBeIgnored`() {
// doSomeThing
}
}