【问题标题】:Robolectric Test not calling textWatcher.onTextChangedRobolectric 测试未调用 textWatcher.onTextChanged
【发布时间】:2015-04-20 20:54:31
【问题描述】:

我有以下 Observable

Observable<OnTextChangeEvent> subjectObservable = WidgetObservable.text(mComposeSubject);

然后呢

subjectObservable.subscribe(s -> onTextChange(mComposeSubject, getString(R.string.blank_warning, mComposeSubject.getHint().toString())));

我还有以下 Robolectric 测试

@Test
public void testOnTextChange_subjectChanged() {
    EmailActivity activity = spy(getActivity());
    activity.mComposeSubject.setText("test");

    assertThat(activity.mSubjectSubscription).isNotNull();
    verify(activity, times(1)).onTextChange(eq(activity.mComposeSubject), anyString());
}

此操作失败,出现 Wanted but not invoked 错误。有没有人知道为什么会这样?据我所知,这使用了一个简单的文本观察器,所以它应该可以工作吗?

【问题讨论】:

  • 我不是 RxJava 方面的专家。订阅在哪个线程上?
  • 应该是主线程。我在活动的初始化中创建它。除非像这样的 observables 碰巧分拆并自己做异步?我知道这肯定会导致 robolectric 出现问题。
  • 所以确保我使用了 .observeOn(AndroidSchedulers.mainThread()) 并确保 ShadowLoopers.runUIThreadTasks 在我的测试中并且仍然没有骰子
  • 这是我的第一个建议。它没有用。您是否有公开的代码可以查看并尝试
  • 我认为问题在于您正在监视测试中的活动,但您的 RAC 接线仍在使用原始活动。您可以尝试将订阅者提取到另一个可以模拟并在测试中注入的类

标签: android mockito robolectric rx-java


【解决方案1】:

出于好奇,我最终将订阅者移动到另一个类,然后使用 Observable.just("Test") 触发订阅方法并验证它是否被调用。

【讨论】:

    【解决方案2】:

    我有一个类似的问题,在我的情况下,Robolectric 测试没有调用 TextWatcher.afterTextChanged

    这是我找到的解决方案

    EditText nameText = (EditText) mParentView.findViewById(R.id.edit_name);
    nameText.setText(accountName);
    Shadows.shadowOf(nameText).getWatchers().get(0).afterTextChanged(null);
    

    更改文本后,我使用ShadowTextView.getWatchers 获取观察者,然后手动调用afterTextChanged 方法(或者在您的情况下为onTextChange

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 1970-01-01
      • 2013-08-04
      • 2013-08-19
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多