2013-11-01 8 views
13

Ho eseguito test con Robolectric ed è stato tutto fantastico. Quindi ho implementato Google Analytics nella mia classe di applicazione e i test hanno iniziato a fallire. L'errore sembra verificarsi quando gonfio le visualizzazioni durante i test. Ecco l'analisi dello stack:Errore nei test su Robolectric e Google Analytics

java.lang.NullPointerException: null 
at com.google.analytics.tracking.android.AnalyticsGmsCoreClient$AnalyticsServiceConnection.onServiceConnected(AnalyticsGmsCoreClient.java:176) 
at org.robolectric.shadows.ShadowApplication$2.run(ShadowApplication.java:209) 
at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162) 
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107) 
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92) 
at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68) 
at org.robolectric.util.Scheduler.unPause(Scheduler.java:25) 
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:219) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:258) 
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:32) 
at android.view.ViewGroup.addView(ViewGroup.java) 
at android.view.ViewGroup.addView(ViewGroup.java:3225) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:750) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
at org.robolectric.shadows.ShadowView.inflate(ShadowView.java:82) 
at android.view.View.inflate(View.java) 

Ecco il codice per il mio Robolectric BaseActivity:

@RunWith(RobolectricTestRunner.class) 
public class BaseActivityTest { 

ActivityController<TestActivity> activityController; 
TestActivity activity; 

@Before 
public void setUp(){ 
    activityController = Robolectric.buildActivity(TestActivity.class).create().start(); 
} 


@After 
public void takeDown(){ 
    activityController.stop().destroy(); 
    activity = null; 
} 

@Test 
public void testOnPauseState(){ 
    activity = activityController.resume().pause().get(); 
    assertFalse(activity.getBus().isActive()); 
} 
} 

Dopo la Google Analytics example, la mia classe di applicazione implementa Google Analytics. Ogni volta che eseguo i test con la mia applicazione, si verifica l'interruzione. Ho provato ad implementare l'oggetto MockApplication di Robolectric, ma questo non ha avuto alcun cambiamento; Ho dovuto rimuovere Google Analytics dal mio oggetto Application per farlo funzionare. Qualcuno ha qualche soluzione che mi consenta di eseguire Robolectric con Google Analytics?

risposta

3

Ho due suggerimenti per voi se si utilizza Google Analytics V3:

1) Hai provato a chiamare questo metodo quando si esegue il test?

googleAnalytics.setAppOptOut(true); 

Disabilita Google Analytics per tutta la durata del test.

2) Creare una classe applicazione di test nello stesso pacchetto come la vostra applicazione corrente e il nome lo stesso nome, ma anteporre "Test" per il nome. Questa applicazione verrà creata durante i test e puoi impostare "setAppOptOut" su true oppure puoi omettere GoogleAnalytics completamente da esso.

Maggiori informazioni possono essere trovate qui: http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html

+1

La seconda opzione ha funzionato. Una cosa importante da ricordare che è spiegato nel collegamento è che le classi dell'applicazione devono essere nello stesso pacchetto (insieme con lo stesso nome con "Test" anteposto alla classe dell'applicazione di test). La prima opzione, anche se ha senso, non sembra registrarsi durante i test. – Maxwell

+0

La prima opzione non funziona per me a causa di che non riesce a 'GoogleAnalytics.getInstance (questo)' pertanto non raggiunge mai la riga che contiene 'setAppOptOut (true)' –

19

C'è un'altra soluzione, se i post precedenti non funzionano. Ottieni un handle per l'applicazione shadow e configuralo per ignorare il binding di intent start dell'analisi. Fallo nella configurazione di prova.

@Before 
public void setup() { 
    ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application); 
    shadowApplication.declareActionUnbindable("com.google.android.gms.analytics.service.START"); 
} 
+0

Questa soluzione ha funzionato per me. – Louth

+0

Dove dovrebbe essere posizionato? In setup() di un test? – loeschg

+1

Ho questo nel mio setup() e funziona. – Jeroen

2

Ho provato tutte le soluzioni di cui sopra e nessuno di loro ha funzionato per me. Questo finalmente ha fatto:

public class TestFooApplication extends FooApplication { 
    @Override 
    public boolean bindService(Intent service, ServiceConnection conn, int flags) { 
     return false; 
    } 
}