2013-11-15 18 views
5

Sono davvero nuovo per Test unità su cellulare. Voglio scrivere test JUnit per l'app per dispositivi mobili Android. Mi sono imbattuto in Robolectric che sta testando in IDE (per me, Eclipse)Oggetto ombra e derisione di Robolectric

Ma davvero non capisco oggetti Shadow di Robolectric. Dovrei usarli come beffardo? Qual è lo scopo di utilizzo di questi oggetti Shadow come ShadowActivity, ecc.?

Ad esempio, ho Crashlytics, codice di Google Analytics nei metodi onCreate in quasi tutte le classi di attività. Robolectric genera un errore quando incontra queste linee. ShadowActivity potrebbe risolvere questi tipi di problemi?

Mi dispiace ma, come ho detto, sono davvero nuovo al Test unitario e le documentazioni su Robolectric non sono utili per un principiante.

risposta

12

Ma davvero non capisco Oggetti ombra di Robolectric. Devo usare come mocking? Qual è lo scopo di utilizzo di questi oggetti Shadow come ShadowActivity, ecc.?

Le ombre sono un po 'come mock o stub, ma non proprio la stessa cosa. Esistono ombre per aggiungere ulteriori metodi che possono essere utilizzati nel test per ispezionare lo stato dell'oggetto Android sottostante. Ad esempio, molti oggetti Android hanno setter per determinati valori, ma non getter. Possiamo aggiungere getter alle ombre e usarli in test per asserire sull'oggetto sottostante.

Ad esempio, ho Crashlytics, codice di Google Analytics in onCreate metodi in quasi ogni classe di attività. Robolectric genera un errore quando trova queste righe. ShadowActivity potrebbe risolvere questi tipi di problemi ?

Probabilmente no. Per questo, dovresti usare dependency injection per iniettare una falsa versione di Crashlytics o GoogleAnalytics nel tuo test.

Lo scopo di Robolectric è di simulare abbastanza della piattaforma Android per consentire di eseguire i test sulla JVM del desktop - non per emulare Android. Si possono ancora utilizzare buone pratiche ingegneristiche come l'iniezione di dipendenza o la derisione.

Mi dispiace, ma, come ho già detto sono davvero un principiante Unit-test e documentazioni Robolectric non sono utili per un principiante.

Sono d'accordo. Stiamo cercando di migliorarlo, ma abbiamo ancora parecchia strada da fare.

0

A proposito di:

Ad esempio, ho Crashlytics, codice di Google Analytics in onCreate metodi in quasi ogni classe di attività. Robolectric genera un errore quando trova queste righe. ShadowActivity potrebbe risolvere questi tipi di problemi ?

È possibile avvolgere le chiamate per le librerie all'interno di un'implementazione Facciata che implementa una sorta di AnalyticsFacade e creare una classe che incapsula tutte le implementazioni e solo delegare il comportamento comune a loro.

public interface Analytics{ 

    void sendEvent(String category, String action, Map<String,String> params); 

    void log(String msg); 
} 

public class AnalyticsFacade implements Analytics{ 
    private List<Analytics> analyticsServices; 

    public AnalyticsFacade() 
    { 
     this.analyticsServices = new ArrayList<Analytics>(); 
    } 

    public void addAnalyticsService(Analytics analytics){ 
     analyticsServices.add(analytics); 
    } 

    @Override 
    public void sendEvent(String category, String action, Map<String, String> params) 
    { 
     for(Analytics service: analyticsServices){ 
      service.sendEvent(category,action,params); 
     } 
    } 

    @Override 
    public void log(String msg) 
    { 
     for(Analytics service: analyticsServices){ 
      service.log(msg); 
     } 
    } 
} 

public class GoogleAnalytics implements Analytics{ 

    private Tracker tracker; 

    public GoogleAnalytics(Tracker tracker) 
    { 
     this.tracker = tracker; 
    } 

    @Override 
    public void sendEvent(String category, String action, Map<String, String> params) 
    { 
     //Note that this method signature has changed since GA v2 , now you pass a Map and 
     //it has a builder in order to create it 
     tracker.send(category,action,params); 
    } 

    @Override 
    public void log(String msg) 
    { 
     throw new RuntimeException("Not implemented"); 
    } 
} 
Problemi correlati