Как мне запустить код в потоке пользовательского интерфейса в тесте Android JUnit без действия?

#android #multithreading #testing #user-interface #junit

#Android #многопоточность #тестирование #пользовательский интерфейс #junit

Вопрос:

У меня есть компонент базы данных, который использует AsyncTask для извлечения данных. После использования в приложении он всегда будет вызываться из потока пользовательского интерфейса, но как мне сделать это в тестах JUnit без создания экземпляра Activity (у меня просто нет действия, и мне не нужно создавать его только для целей тестирования)?

runOnUiThread() это метод activity, поэтому это не вариант. Есть ли способ имитировать поток пользовательского интерфейса, либо получив его из тестовой библиотеки Android, либо внедрив MockUiThread?

Комментарии:

1. Какой базовый класс вашего теста?

Ответ №1:

Android.OS.Handler должен иметь возможность обновлять пользовательский интерфейс.

Чтобы использовать обработчик, вы должны подклассировать его и переопределить handleMessage() для обработки сообщений

Обновить:

Я использую monodroid, поэтому я не знаю, можно ли это полностью перевести, но,

Возможно, вы сможете использовать

 new Handler(context.getMainLooper()).post(runnable);
  

Комментарии:

1. Спасибо, это работает и в обычном Android. 🙂 В другом потоке я прочитал, что все, что мне действительно нужно сделать, это создать экземпляр одной AsyncTask в потоке пользовательского интерфейса, прежде чем создавать какие-либо другие, и следующие автоматически узнают поток пользовательского интерфейса, кажется, это отлично работает! Спасибо.

2. context может быть взято из приложения следующим образом, если действие недоступно в области тестирования: Application context = (Application)InstrumentationRegistry.getTargetContext().getApplicationContext();