【问题标题】:Observer.hasActiveObservers() is false when state is RESUMED?当状态恢复时,Observer.hasActiveObservers() 为假?
【发布时间】:2019-06-05 16:24:42
【问题描述】:

我正在尝试在Viewmodel 中测试一些LiveData

我已经嘲笑了LifecycleOwnerLifecycleRegistry

我的测试方法如下:

@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.STARTEDLifecycle.State.RESUMED 状态的观察者(这意味着状态处于活动状态),hasActiveObservers() 应该返回true

我错过了什么吗?

【问题讨论】:

  • 如果你模拟了LifecycleRegistry,那么setCurrentState() 不会调用实际的实现。你为什么要嘲笑LifecycleRegistry
  • @ianhanniballake 有道理,你是对的。我应该只模拟 LifecycleOwner 并像往常一样创建生命周期注册表吗?这是你应该做的测试 Viewmodel Livedata 吗?
  • 如果你想要LifecycleRegistry的真实行为,那么你应该创建一个真实的LifecycleRegistry对象。
  • 好的,我明白了。测试运行正常,感谢您的帮助。如果你愿意,你可以回复第一条评论作为回答,这样我就可以接受任何未来的观众。

标签: android


【解决方案1】:

如果您模拟了LifecycleRegistry,那么setCurrentState() 不会调用实际的实现。如果您想要LifecycleRegistry 的真实行为(即实际将状态更改为活动状态),那么您应该创建一个真实的LifecycleRegistry 对象。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多