2015-12-11 4 views
14

У меня есть простой класс Job, который проходит HandlerThread:Robolectric 3,0, не удалось протестировать функцию, которая запускает HandlerThread

public class Job extends HandlerThread{ 
    public Job(String name) { 
    super(name); 
    } 
    ... 
} 

Тогда у меня есть JobUtils класс, который имеет функцию, чтобы получить Job & start() это :

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 в моем тестовом модуле, я тестирую JobUtils класс getAndStartJob(String name) functi на:

@RunWith(RobolectricTestRunner.class) 
public class TestJobUtils{ 
@Test 
public void testGetAndStartJob() { 
    JobUtils jobUtils = new JobUtils(); 

    // error here 
    jobUtils.getAndStartJob(“test-job”); 
    … 
} 
} 

Когда я запускаю мой модульного тестирования кода, я получил ошибку

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 не умеет запускать HandlerThreadjob instace в моем коде), или сделать Я что-то пропустил? Как избавиться от этой проблемы?

ответ

3

Я столкнулся с аналогичной проблемой, не уверен, что ваша причина такая же, потому что я использовал RobolectricGradleTestRunner, и вы не разместили весь метод метода тестирования. В моем случае выясняется, что приложение Robolectric (RuntimeEnvironment.application) установлено в null (источник NPE) до того, как HandlerThread начинает выполнение, потому что метод тестирования достигает конца раньше.

Обход должен ждать всех запланированных runnables в конце метода испытаний:

Robolectric.flushBackgroundThreadScheduler(); 
    Robolectric.flushForegroundThreadScheduler();