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();