Тест asyncTask не выполняется

Я использую robolectric для тестирования класса AsyncTask. В тесте он делает то, что я ожидаю, когда задача выполняется так:

asyncTask.execute() 

Но когда я сделаю

 asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 

Это не так (в обоих случаях я запускаю

 Robolectric.runUiThreadTasksIncludingDelayedTasks() 

У любого есть идея, почему вызов executeOnExecutor не запускает Robolectric для запуска, но выполнение работает нормально?

Рамка Robolectric не может работать из коробки с исполнителями по умолчанию (то есть либо AsyncTask.THREAD_POOL_EXECUTOR, либо AsyncTask.SERIAL_EXECUTOR), ни с пользовательскими.

Чтобы решить эту проблему, вы можете взять один из этих двух подходов, в зависимости от того, имеете ли вы контроль над исполнителем, которого использует тестируемый блок. Если ответ «ДА», первым подходом было бы просто заставить его использовать RoboExecutorService (или использовать версии под 3.0 – RobolectricBackgroundExecutorService ). В противном случае вам придется придерживаться другого подхода, который заключается в применении этого двухэтапного решения:

Определение пользовательской тени AsyncTask

Первое, что вам нужно сделать, это реализовать тень AsyncTask которая отменяет выполнение для пользовательских исполнителей:

 @Implements(AsyncTask.class) public class MyShadowAsyncTask<Params, Progress, Result> extends ShadowAsyncTask<Params, Progress, Result> { @Implementation public AsyncTask<Params, Progress, Result> executeOnExecutor(Executor executor, Params... params) { return super.execute(params); } } 

Регистрация пользовательской тени

В каждом тестовом случае, в котором выполняется производственный код, который использует AsyncTask#executeOnExecutor() , зарегистрируйте свой собственный тень для переопределения по умолчанию Robolectric (просмотрите аннотацию «config»):

 @RunWith(RobolectricTestRunner.class) @Config(shadows={MyShadowAsyncTask.class}) public class MyTest { // ... test code } 

Robolectric.runUiThreadTasks() вызовы Robolectric.runUiThreadTasks() или Robolectric.runUiThreadTasksIncludingDelayedTasks() будут работать так, как вы ожидали (а именно, заблокировали бы поток бегунов до завершения асинхронных задач).