【发布时间】:2019-06-05 16:24:42
【问题描述】:
我正在尝试在Viewmodel 中测试一些LiveData
我已经嘲笑了LifecycleOwner 和LifecycleRegistry
我的测试方法如下:
@Test
public void testLifecycle(){
assertThat(viewModel.user().hasObservers(), is(false));
Observer<FirebaseUser> firebaseUserObserver = (Observer<FirebaseUser>)mock(Observer.class);
viewModel.user().observe(lifecycleOwner, firebaseUserObserver);
assertThat(viewModel.user().hasObservers(), is(true));
lifecycleRegistry.setCurrentState(Lifecycle.State.RESUMED);
assertThat(viewModel.user().hasActiveObservers(),is(true)); //assertion failure
lifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
assertThat(viewModel.user().hasActiveObservers(), is(false));
}
当我运行此方法时,我在以下位置遇到断言失败:
assertThat(viewModel.user().hasActiveObservers(),is(true));
我不明白为什么这会失败。如果LiveData 至少有一个生命周期为Lifecycle.State.STARTED 或Lifecycle.State.RESUMED 状态的观察者(这意味着状态处于活动状态),hasActiveObservers() 应该返回true。
我错过了什么吗?
【问题讨论】:
-
如果你模拟了
LifecycleRegistry,那么setCurrentState()不会调用实际的实现。你为什么要嘲笑LifecycleRegistry? -
@ianhanniballake 有道理,你是对的。我应该只模拟 LifecycleOwner 并像往常一样创建生命周期注册表吗?这是你应该做的测试 Viewmodel Livedata 吗?
-
如果你想要
LifecycleRegistry的真实行为,那么你应该创建一个真实的LifecycleRegistry对象。 -
好的,我明白了。测试运行正常,感谢您的帮助。如果你愿意,你可以回复第一条评论作为回答,这样我就可以接受任何未来的观众。
标签: android