roboelectric测试无法在Tasks.await上放置自动完成适配器(结果,60,TimeUnit.SECONDS)

时间:2018-02-22 09:49:50

标签: android robolectric

我正在为SearchFragment编写一个AutoCompleteTextView seachAutoComplete的测试用例。 seachAutoComplete使用PlaceAutocompleteAdapter extends : BaseAdapter() implements Filterable(就像this)来显示结果。

我在roboelectric中正在测试它

@Test
public void testAutosuggestAdaptor() {
    SearchFragment fragment = new SearchFragment();
    startFragment(fragment);
    AutoCompleteTextView searchBar = 
    rootView.findViewById(R.id.location_auto_fill_edit_Text);
    searchBar.setText("hsr");
}

但我的测试用例在Tasks.await(results, 60, TimeUnit.SECONDS)失败了 发出例外

java.lang.IllegalStateException: Must not be called on the main application thread

1 个答案:

答案 0 :(得分:0)

这是因为对于Robolectric,Filter在主线程上运行(请参见ShadowFilter)。解决方法是,您可以在等待结果之前添加检查任务是否已完成的检查。例如,代替:

ResultType resultData = Tasks.await(task, 60, TimeUnit.SECONDS)

使用类似的东西:

ResultType resultData;
try {
    if (task.isSuccessful()) {
        resultData = task.getResult();
    } else {
        resultData = Tasks.await(task, 60, TimeUnit.SECONDS);
    }
} catch (InterruptedException
        | RuntimeExecutionException
        | CancellationException
        | ExecutionException
        | TimeoutException ex) {
    // handle error case
}

假设您在测试用例中使用的是Tasks.forResult()之类的东西,Task将已经完成,因此从测试运行时将永远不会调用Tasks.await()。以这种方式使用它仍然是安全的,您很可能永远都不会碰到现实世界中的第一种情况。