2015-12-11 9 views
14

ho una semplice classe Job che si estende HandlerThread:Robolectric 3.0, non è riuscito a testare una funzione che avvia un HandlerThread

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

Poi, ho una classe JobUtils che ha una funzione per ottenere un Job & start() esso :

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

io uso Robolectric 3.0 nel mio test di unità, provo JobUtils classe getAndStartJob(String name) functi on:

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

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

Quando eseguo il mio codice di unit test, ho ottenuto l'errore

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) 

Sembra Robolectric non è in grado di avviare il HandlerThread (il job instace nel mio codice), o fare Mi manca qualcosa? Come sbarazzarsi di questo problema?

risposta

3

Ho affrontato un problema simile, non so se il tuo motivo è lo stesso perché ho usato RobolectricGradleTestRunner e non hai pubblicato il corpo del metodo di test completo. Nel mio caso risulta che l'applicazione di Robolectric (RuntimeEnvironment.application) è impostata su null (origine di NPE) prima che HandlerThread inizi l'esecuzione perché il metodo di prova raggiunge la fine prima.

soluzione alternativa è quella di attendere che tutti runnables in programma alla fine del metodo di prova:

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