[Kotlin + JUnit] BeforeClass/AfterClass なメソッドには JvmStatic が必要

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 なメソッドになります。

Static Methods

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 として定義します。

Annotation Type BeforeClass

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 だとメソッドが使用されていない旨の警告になります。こんな感じで。

kotlin-beforeclass
JvmStatic がない場合

@JvmStatic がある場合

@JvmStatic を付けてあげるとちゃんと呼ばれます。

class ExampleUnitTest {
    companion object {
        @BeforeClass
        @JvmStatic
        fun setUpClass() {
            assertTrue(false)  // ← 呼ばれる
        }

        @AfterClass
        @JvmStatic
        fun tearDownClass() {
            assertTrue(false)  // ← 呼ばれる
        }
    }

    // 以下略
}

コメントを残す

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