Robolectric test и LiveData

Чтобы повесить Kotlin, LiveData и Robolectric alltogether, я получил простое действие заставки.

Он работает правильно при запуске приложения, но он не работает в тесте. Это похоже на обратный вызов живых данных, который никогда не срабатывает, или, как если бы для него не было зарегистрировано никакого обервера.

Вот тест:

@Test fun should_redirect_to_login_when_time_is_up_after_onStart() { val timeUp = MutableLiveData<Boolean>() kodein.addConfig { bind<SplashViewModel>(overrides = true) with factory { _: BaseActivity -> mock<SplashViewModel> { on { isTimeUp() } doReturn timeUp } } } val activity = Robolectric.buildActivity(SplashActivity::class.java).create().start().resume().get() timeUp.value = true val startedIntent = shadowOf(activity).nextStartedActivity assertThat(startedIntent).isNotNull assertThat(startedIntent).hasComponent(application.packageName, LoginActivity::class.java) } 

Активность:

 class SplashActivity : JapetActivity() { lateinit var viewModel: SplashViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) viewModel = kodein.with(this).instance() viewModel.isTimeUp().observe(this, Observer<Boolean?> { b -> transitionIfTimeUp(b ?: false) }) transitionIfTimeUp(viewModel.isTimeUp().value ?: false) } private fun transitionIfTimeUp(isTimeUp: Boolean) { if (isTimeUp) { startActivity(Intent(this, LoginActivity::class.java)) finish() } } } 

Модель представления (которая все равно насмехается, поэтому реализация не используется):

 /** * ViewModel for data of the splash screen */ interface SplashViewModel { /** Have we shown the splash screen long enough? */ fun isTimeUp(): LiveData<Boolean> } /** * Default implementation of the view model */ class SplashViewModelImpl : ViewModel(), SplashViewModel { companion object { private const val SPLASH_DURATION_MS = 2000L } private val isTimeUp = MutableLiveData<Boolean>() init { isTimeUp.value = false Observable.timer(SplashViewModelImpl.SPLASH_DURATION_MS, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe { isTimeUp.value = true } } override fun isTimeUp(): LiveData<Boolean> = isTimeUp } 

    Похоже, что Robolectric не запускает методы Lifecycle для Android, поэтому LiveData не будет обновлять наблюдателей. Я смог исправить это, вручную инициировав событие «ON_START» Lifecycle после того, как активность была создана Robolectric:

     activity.lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)