我正在为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
答案 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()
。以这种方式使用它仍然是安全的,您很可能永远都不会碰到现实世界中的第一种情况。