Я недавно начал использовать Robolectric для тестирования некоторых моих приложений для Android и столкнулся с проблемой. В нескольких местах я использую AsyncTasks для выполнения некоторых фоновых вычислений, а затем обновляю пользовательский интерфейс в зависимости от результата этих вычислений. Если я использую execute()
, чтобы вывести AsyncTask, когда я запускаю свои тесты, чтобы проверить, правильно ли обновлен пользовательский интерфейс. Однако по разным причинам я фактически использую exectueOnExecutor()
с параметром THREAD_POOL_EXECUTOR
. Когда я запускаю тесты с этим, тесты терпят неудачу, думая, что пользовательский интерфейс не обновлен. Аналогично, если я делаю это из потока и отправляю обратно в поток пользовательского интерфейса, у меня такая же проблема. Есть ли способ обойти это?Robolectric, AsyncTasks и Threads
ответ
После нескольких часов поиска this нить помогла мне решить мою проблему. В простых шагах вы должны создать новый класс, который затеняет ваши AsyncTasks, которые используют executeOnExecutor()
из-за того, что кажется ошибкой в структуре Robolectric. Вот пример из вышеупомянутой темы:
@Implements(AsyncTask.class)
public class MyShadowAsyncTask<Params, Progress, Result> extends ShadowAsyncTask<Params, Progress, Result> {
@RealObject private AsyncTask<Params, Progress, Result> realAsyncTask;
@Implementation
public AsyncTask<Params, Progress, Result> executeOnExecutor(Executor executor, Params... params) {
return super.execute(params);
}
}
Кроме, возможно, изменить название класса мне не нужно ничего менять, чтобы заставить его работать. Последний шаг просто аннотировать тестовый класс с
@Config(shadows={MyShadowAsyncTask.class})
прекрасно работает для меня.
Вы пробовали ['flushBackgroundThreadScheduler()'] (http: // robolectric .org/javadoc/3.0/org/robolectric/Robolectric.html)? –
Вы всегда можете просмотреть, как они используют Robolectric для тестирования AsyncTasks. https://github.com/robolectric/robolectric/blob/master/robolectric/src/test/java/org/robolectric/shadows/ShadowAsyncTaskTest.java –