Robolectric 3.0, не удалось проверить функцию, которая запускает HandlerThread
У меня есть простой класс Job
, который расширяет HandlerThread:
public class Job extends HandlerThread{
public Job(String name) {
super(name);
}
...
}
Тогда у меня есть класс JobUtils
, который имеет функцию для получения Job
и start()
it:
public JobUtils {
public JobUtils() {
}
// I unit test this function in my test class below
public Job getAndStartJob(String name) {
Job job = new Job(name);
job.start();
}
}
Я использую Robolectric 3.0 в моей функции unit test, я test JobUtils
class getAndStartJob(String name)
:
@RunWith(RobolectricTestRunner.class)
public class TestJobUtils{
@Test
public void testGetAndStartJob() {
JobUtils jobUtils = new JobUtils();
// error here
jobUtils.getAndStartJob("test-job");
…
}
}
Когда я запускаю свой код unit test, я получил ошибку
Exception in thread "test-job" java.lang.NullPointerException
at org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:70)
at org.robolectric.shadows.ShadowLooper.doLoop(ShadowLooper.java:85)
at org.robolectric.shadows.ShadowLooper.loop(ShadowLooper.java:76)
at android.os.Looper.loop(Looper.java)
at android.os.HandlerThread.run(HandlerThread.java:60)
Похоже, что Robolectric не может запустить HandlerThread
(Job
instace в моем коде), или мне что-то не хватает? Как избавиться от этой проблемы?
Ответы
Ответ 1
Я столкнулся с подобной проблемой, не уверен, что ваша причина такая же, потому что я использовал RobolectricGradleTestRunner
, и вы не разместили весь метод метода тестирования.
В моем случае выясняется, что приложение Robolectric (RuntimeEnvironment.application
) установлено на null
(источник NPE) до того, как HandlerThread
начнет выполнение, потому что тестовый метод дойдет до конца раньше.
Обходным решением является ожидание всех запланированных runnables в конце тестового метода:
Robolectric.flushBackgroundThreadScheduler();
Robolectric.flushForegroundThreadScheduler();