Тестирование устройств Android с помощью решения AsyncTask и UI Updates

Сценарий:

Я пытаюсь выполнить модульное тестирование обработчика onClick моего приложения. Onclick выполняет простой поиск по REST API, возвращает результаты и обновляет пользовательский интерфейс.

Детали:

Onclick выполняет AsyncTask, doInBackground запрашивает API REST и возвращает результаты. OnPostExecute принимает результаты и назначает новый ListAdapter в ListView с данными.

Проблема:

OnPostExecute не получает вызов в Test Runner, поскольку он находится в одном и том же потоке пользовательского интерфейса и блокирует вызов. Существует несколько шаблонов для решения этой проблемы. Однако, если я поместил AsyncTask в Runnable и воспользуюсь LatchCountdown, чтобы дождаться результата, я получаю CalledFromWrongThread Exception.

Есть ли хорошее решение для модульного тестирования AsyncTask, который обновляет UI? Или более тестируемый дизайн, который я могу реализовать?

Вы хотите запустить тест на Ui Thread

runOnUiThread(new Runnable() { public void run() { onPostExecute(...) } }); 

Итак, решение, которое я придумал, следующее:

1.) Определите интерфейс прослушивателя для событий pre & post.
2.) Внедрить слушателя по деятельности
2.) Определите класс-оболочку задачи, который принимает слушателя, и у которого есть внутренняя AsyncTask, вызываемая в 'exec'.
3.) Внутренняя AsyncTask уведомляет слушателя о onPreExecute и onPostExecute
4.) После уведомления активность обновляет его пользовательский интерфейс.

Для тестирования в Управлении:
1.) Создайте серийную версию класса-оболочки, наследуя ее, затем переопределив метод exec для выполнения последовательно:
– уведомлять слушателя о запуске задачи.
– выполнить задачу.
– уведомить слушателя, что задача выполнена.

Для тестирования асинхронной версии задачи.
1.) Используйте метод CountdownLatch и Runnable в модульном методе тестирования. Поскольку не будет никаких обновлений UI, вы не будете иметь никаких ошибок WrongThreadExceptions.

Intereting Posts