2017-07-12 24 views
2

Kotlin、LiveData、Robolectricが一斉にハングするには、簡単なスプラッシュ画面のアクティビティが得られました。RobolectricテストとLiveData

アプリケーションの実行中は正しく動作しますが、テストでは機能しません。これは、ライブデータのコールバックがトリガーされないか、またはオーバーバーが登録されていない場合と同じです。

@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 
} 
+0

同じ問題が発生しています。あなたはそれを理解することができましたか? – Emmanuel

答えて

1

それをここ

テストでありますRobolectricがAndroid Lifecycleメソッドを起動しないように見えるので、LiveDataはオブザーバを更新しません。 Robolectricによってアクティビティが作成された後に、「ON_START」ライフサイクルイベントを手動でトリガすることでこれを修正できました。

activity.lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START) 
関連する問題