2013-11-15 18 views
5

私は携帯電話でユニットテストをしています。私はAndroidモバイルアプリのJUnitテストを書いてみたいと思います。私はRobolectric IDEでテストしています(私にとってはEclipse)Robolectricの陰影オブジェクトとモック

しかし、私は本当にRobolectricのシャドーオブジェクトを理解していません。私はそれらを嘲笑として使うべきですか? ShadowActivityなどのShadowオブジェクトの使用目的は何ですか?

たとえば、Googleアナリティクスのコードは、ほぼすべてのアクティビティクラスのonCreateメソッドにクラッシュしています。 Robolectricはこれらの行に遭遇するとエラーをスローします。 ShadowActivityはこれらのタイプの問題を解決できましたか?

申し訳ありませんが、私が言ったように、私はUnit-Testingで本当に新しく、Robolectricのドキュメントは初心者にとって役に立ちません。

答えて

12

しかし、私は本当にRobolectricのシャドーオブジェクトを理解していません。私は をモックとして使うべきですか? ShadowActivityなどのShadowオブジェクト の使用目的は何ですか?

シャドウはモックまたはスタブのようなものですが、全く同じではありません。基礎となるAndroidオブジェクトの状態を検査するためにテストで使用できる追加のメソッドを追加するための影があります。たとえば、多くのAndroidオブジェクトには特定の値のセッターがありますが、ゲッターはありません。ゲッターをシャドーに追加してテストで使用して、基礎となるオブジェクトをアサートすることができます。

たとえば、ほぼすべてのアクティビティクラスでonCreate メソッドのGoogleアナリティクスコードを使用しています。 Robolectricは、 がこれらの行に出会うとエラーをスローします。 ShadowActivityはこれらの タイプの問題を解決できますか?

おそらくそうではありません。そのためには、依存関係注入を使用して、CrashlyticsやGoogleAnalyticsの偽のバージョンをテストに注入する必要があります。

Robolectricの目的は、Androidプラットフォームを十分に偽造して、デスクトップのJVMで のテストを実行できるようにすることです。Androidをエミュレートするのではありません。依存性注入やモックなどの優れたエンジニアリング手法も引き続き使用できます。

私はユニットテストで本当に新たなんだと Robolectricドキュメンテーションは、初心者のために役立たない言ったように私は、申し訳ないけど。

私は同意します。私たちはそれをより良くしようとしていますが、私たちは長い道のりがあります。

0

について:

例えば、私はほとんどすべてのActivityクラスにCrashlytics、のonCreate 方法でGoogle Analyticsのコードを持っています。 Robolectricは、 がこれらの行に出会うとエラーをスローします。 ShadowActivityはこれらの タイプの問題を解決できますか?

あなたはAnalyticsFacadeのいくつかの並べ替えを実装ファサードを実装内部のライブラリの呼び出しをラップし、すべての実装をカプセル化するクラスを作成し、ちょうどそれらに共通する行動を委任することができます。

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"); 
    } 
} 
関連する問題