2015-05-11 15 views
10

Aggiunto LeakCanary (1.3) alla mia domanda:NullPointerException da LeakCanary durante l'esecuzione di test Robolectric

@Override 
public void onCreate() { 
    super.onCreate(); 
    Fabric.with(this, new Crashlytics()); 
    LeakCanary.install(this); 

Quando eseguo la suite di test Robolectric per la mia applicazione ottengo un NullPointerException in LeakCanary.

Caused by: java.lang.NullPointerException 
at com.squareup.leakcanary.LeakCanary.isInServiceProcess(LeakCanary.java:165) 
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:141) 
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:52) 
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:43) 
at com.package.application.MyApplication.onCreate(MyApplication.java:50) 
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:131) 
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:431) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:224) 

Ho aggiunto che Im usando Crashlytics a sottolineare che esso (e di altri metodi e) riceve la stessa applicazione, ma non genera alcuna eccezione.

Non ero sicuro se questo dovrebbe essere qui o sui problemi di GitHub per LeakCanary. Qualcun altro ha avuto questo problema?

+1

Date un'occhiata al il codice sorgente di LeakCanary.java, sembra che la HeapAnalyzerService non è in esecuzione durante l'esecuzione dei test. – WenChao

+2

Ignora l'applicazione nei test e sopprime l'inizializzazione di Crashlitics e LeakCanary. Maggiori informazioni qui (http://robolectric.org/custom-test-runner/) –

+0

Grazie! Sono andato con l'opzione di classe dell'applicazione personalizzata. – erafn

risposta

7

Conversione del mio commento alla risposta.

Robolectric fornisce un modo per gestire diverse inizializzazioni e cicli di vita del test dell'applicazione tramite l'applicazione di test.

Ecco la classe di applicazione:

public class <YourAppplication> extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Fabric.with(this, new Crashlytics()); 
     LeakCanary.install(this); 
    } 
} 

Si dovrebbe mettere a fonti di prova nello stesso pacchetto come applicazione tua classe successiva:

public class Test<YourAppplication> extends <YourApplication> { 
    @Override 
    public void onCreate() { 
    } 
} 

Robolectric caricherà al posto della vostra applicazione. Come puoi vedere, sopprimo tutte le inizializzazioni statiche dall'applicazione.

È possibile trovare maggiori dettagli here

0

Un modo semplice per evitare il NullPointerException è quello di disabilitare LeakCanary per i test unitari specificando il rilascio (no-op) versione della direttiva testCompile in build.gradle. Per esempio:

dependencies { 
    ... 
    testCompile (
     'junit:junit:4.12', 
     'org.robolectric:robolectric:3.0', 
     'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' 
    ) 
    ... 
} 
Problemi correlati