そのまま実行するとLooperでエラーが出る
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
TaskExecutorを継承したテスト用のクラスを作る
class TestArchTaskExecutor : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) {
runnable.run()
}
override fun isMainThread(): Boolean {
return true
}
override fun postToMainThread(runnable: Runnable) {
runnable.run()
}
}
beforeEachTestでExecutorを差し替え、終わったらafterEachTestでnullに差し替える
object HogeViewModelTest : Spek({
beforeEachTest {
ArchTaskExecutor.getInstance().setDelegate(TestArchTaskExecutor())
}
afterEachTest {
ArchTaskExecutor.getInstance().setDelegate(null)
}
Feature("機能") {
Scenario("シナリオ") {
lateinit var viewModel: HogeViewModel
val observer = mockk<Observer<Int>>()
Given("ViewModelの生成") {
viewModel = createViewModel()
viewModel.action.observeForever(observer)
}
When("なんかすると") {
viewModel.onClick()
}
Then("値が変わる") {
verify {
observer.onChanged(1)
}
}
}
})