2015-08-07 1 views
3

Я недавно начал использовать Robolectric для тестирования некоторых моих приложений для Android и столкнулся с проблемой. В нескольких местах я использую AsyncTasks для выполнения некоторых фоновых вычислений, а затем обновляю пользовательский интерфейс в зависимости от результата этих вычислений. Если я использую execute(), чтобы вывести AsyncTask, когда я запускаю свои тесты, чтобы проверить, правильно ли обновлен пользовательский интерфейс. Однако по разным причинам я фактически использую exectueOnExecutor() с параметром THREAD_POOL_EXECUTOR. Когда я запускаю тесты с этим, тесты терпят неудачу, думая, что пользовательский интерфейс не обновлен. Аналогично, если я делаю это из потока и отправляю обратно в поток пользовательского интерфейса, у меня такая же проблема. Есть ли способ обойти это?Robolectric, AsyncTasks и Threads

+0

Вы всегда можете просмотреть, как они используют Robolectric для тестирования AsyncTasks. https://github.com/robolectric/robolectric/blob/master/robolectric/src/test/java/org/robolectric/shadows/ShadowAsyncTaskTest.java –

ответ

0

После нескольких часов поиска 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})

прекрасно работает для меня.

+0

Вы пробовали ['flushBackgroundThreadScheduler()'] (http: // robolectric .org/javadoc/3.0/org/robolectric/Robolectric.html)? –