@ClassRules
は、@BeforeClass
や@AfterClass
の代替です。
public static
なTestRule
クラスにアノテーションをつけることで、テストクラス前に呼び出されます。
しかし、PowerMockRunnerを使うと呼ばれません。
これはバグのようです。参考
以下は、kotlinのソースで、public staticなTestRuleを実装したRxImmediateSchedulerRuleという型のフィールドにClassRuleを宣言していますが、動作しません。
@RunWith(PowerMockRunner::class)
@PrepareForTest(Auth::class)
class LoginViewModelTest {
companion object {
@JvmField
@ClassRule
val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
}
@Test
fun onClickLogin() {
val mockAuth = PowerMockito.mock(Auth::class.java)
val target = LoginViewModel(mockAuth)
target.mail.set("email")
target.password.set("password")
val result = Single.just(AuthEntity().apply {
accessToken = "123456"
userId = 100
})
PowerMockito.`when`(mockAuth.login("email", "password")).thenReturn(result)
target.onClickLogin().run()
Mockito.verify(mockAuth).login("email", "password")
}
}
根本的な解決ではないですが、@ClassRule
をやめて@Rule
にすると動作します。
@Rule
val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
// companion object {
// @JvmField
// @ClassRule
// val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
// }