Kotlin + JUnit でテストクラスを書く場合、@BeforeClass
, @AfterClass
を付けるメソッドには @JvmStatic
アノテーションが必要です。
@JvmStatic って?
名前の通りですが、Java の static と完全に同じ意味にします。
通常、Kotlin で Java の static メソッドと同じようなことをしたい場合は Companion オブジェクトを用います。
class MyClass {
companion object {
fun myFun () {
// ...
}
}
}
しかしこの myFun
を Java から見た場合、myFun
は static メソッドではありません。
// Java
MyClass.myFun(); // 存在しない
MyClass.Companion.myFun(); // 存在する
そこで @JvmStatic
を付与すると Java の世界でも static なメソッドになります。
Kotlin can also generate static methods for functions defined in named objects or companion objects if you annotate those functions as
@JvmStatic
.
JUnit
さて、JUnit の @BeforeClass
、@AfterClass
アノテーションをつけるメソッドは static として定義します。
Annotating a
public static void
no-arg method with@BeforeClass
causes it to be run once before any of the test methods in the class.
もうおわかりかもしれませんが、@JvmStatic
を付けない場合、JUnit がそのメソッドを @BeforeClass
、@AfterClass
として認識してくれません。
@JvmStatic がない場合
@JvmStatic
を付け忘れると呼ばれません。
class ExampleUnitTest {
companion object {
@BeforeClass
fun setUpClass() {
assertTrue(false) // ← 呼ばれない!
}
@AfterClass
fun tearDownClass() {
assertTrue(false) // ← 呼ばれない!
}
}
// 以下略
}
ちなみに Android Studio だとメソッドが使用されていない旨の警告になります。こんな感じで。

@JvmStatic がある場合
@JvmStatic
を付けてあげるとちゃんと呼ばれます。
class ExampleUnitTest {
companion object {
@BeforeClass
@JvmStatic
fun setUpClass() {
assertTrue(false) // ← 呼ばれる
}
@AfterClass
@JvmStatic
fun tearDownClass() {
assertTrue(false) // ← 呼ばれる
}
}
// 以下略
}