【问题标题】:Testing RxBinding RxSearchView测试 RxBinding RxSearchView
【发布时间】:2016-11-25 03:32:38
【问题描述】:

背景

public Observable<List<Foo>> search(SearchView searchView) {

    return RxSearchView.queryTextChanges(searchView)
            .filter(charSequence -> !TextUtils.isEmpty(charSequence))
            .throttleLast(100, TimeUnit.MILLISECONDS)
            .debounce(200, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(AndroidSchedulers.mainThread())
            .flatMap(this::performSearch) //Search the DB
            .onErrorResumeNext(this::doSomething);
}

我正在尝试使用AndroidJUnit4 runner 和Mocktio 测试上述方法。

@Test
public void testSearchCallsDataManager_WhenCalled() {

    String input = "abc";

    when(mockSearchView.getQuery()).thenReturn(input);

    searchRequestManager.search(mockSearchView).subscribe(testSubscriber); //Using standard TestSubscriber

    testSubscriber.assertNoErrors();
    testSubscriber.assertNotCompleted();
    verify(mockDataManager).getFoos(input);
}

问题

我尝试过使用mockSearchView 和真正的SearchView

mockSearchView = mock(SearchView.class);
searchView = new SearchView(InstrumentationRegistry.getContext(), null);
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null);

真实对象在测试运行时,在它们的实例化过程中会导致不同的异常。模拟对象在执行过程中似乎没有任何作用。

更新

为了清楚起见:理想情况下,如果我可以模拟 SearchView 会很棒,因为我想测试在发出某些东西之后会发生什么,并且使用正确的输入调用 performSearch 方法。

【问题讨论】:

  • 如何实例化 InstrumentationRegistry?我通常会这样做:@Rule public ActivityTestRule mBaseActivity = new ActivityTestRule(YourActivity.class, true, true);然后你可以做 SearchView searchView = new SearchView(mBaseActivity.getActivity());

标签: android rx-java android-appcompat searchview rx-android


【解决方案1】:

为了测试 RxBindings,我只是简单地使用 Espresso 并将 debounce 设置为 0(去抖时间为公共静态,在 espresso setUp() 方法中我将其设置为 0)。那么就

onView(withId(yourId)).perform(ViewActions.replaceText(to something))  

只需使用throttleLast() 运算符验证您的 Mockito 或任何类似的东西。

干杯

【讨论】:

  • 感谢您的回答,这在我转向 BDD 但测试在 JVM 中运行以测试 SearchView 的输出是否通过 DataManager 触发搜索时很有用。答案可能是测试需要作为 Espresso 测试运行,但我希望这个特定的测试可以在 JVM 上运行,因为此时我实际上并不关心 SearchView。
  • 所以 Mockito 可能不足以模拟 searchView。尝试使用 PowerMockito 或类似的东西。但我相信绕过它会做很多工作,而且 SearchView 是 UI,所以它应该在 Instrumentation 部分进行测试。如果你想测试什么时候发出一些东西,那么只需测试你的代码 performSearch 和 doSomething 并在 Instrumentation 部分测试它是否被触发。应该是这样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多