2013-03-06 16 views
6

私はダガーとサービスTelephonyManagerを注入しようとしています。私はこれに続くsampleです。グラフを作成するためにApplicationクラスを拡張し、ApplicationModuleを定義しました。ここではServiceModuleが含まれており、他のモジュールも将来含まれます。ダガーとRobolectricとの注入サービス

編集:

今すぐシステムサービスは、何の問題もなくActivityに注入されます。私はActivityの中にFinderApplication.inject(this)がありませんでした。それは注射を持っていますが、まだ試験の下にRobolectricで注射しません。

編集-2: ApplicationModuleが削除されてBaseActivityを作成:onCreate方法に

((FinderApplication) getApplication()).getGraph().inject(this); 

私は、この記事の下部にあるテストケースを追加しました。 )(ServiceModule

しかし、私は空のコンストラクタを定義する場合に注入クラスがあるとき、私はNULLポインタを取得:。java.lang.NoSuchMethodException:

によって引き起こさ:私は取得していますエラーがあります必要です。

FinderApplication.java

public class FinderApplication extends Application { 
    private ObjectGraph mObjectGraph; 

    @Override 
    public final void onCreate() { 
     super.onCreate(); 
     mObjectGraph = ObjectGraph.create(new ServiceModule(this)); 
    } 

    public final ObjectGraph getGraph() { 
     return mObjectGraph; 
    } 
} 

ServiceModule.java

@Module(entryPoints = { SimCardActivity.class, SimService.class }) 
public class ServiceModule { 

    private Context mContext; 

    public ServiceModule(Context context) { 
     mContext = context; 
    } 

    @Provides @Singleton 
    TelephonyManager provideTelephonyManager(){ 
     return (TelephonyManager) mContext 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    } 
} 

SimCardActivityTest.java

@RunWith(RobolectricTestRunner.class) 
public class SimCardActivityTest { 

    @Before 
    public void setUp() throws Exception { 
     ObjectGraph.create(new TestModule()).inject(this);; 
    } 

    @Module(
      includes = ServiceModule.class, 
      overrides = true, 
      entryPoints = {SimCardActivityTest.class, SimCardActivity.class} 
    ) 
    static class TestModule{ 
     public static TelephonyManager TELEPHONY_MANAGER = 
      Mockito.mock(TelephonyManager.class); 

     @Provides @Singleton 
     TelephonyManager provideTelephonyManager(){ 
      return TELEPHONY_MANAGER; 
     } 
    } 
} 
+0

は私が他のモジュールのメンバーを提供します@Module注釈内のフラグが含まれないと思います。 "includes"は、別のモジュールを使用して、各エントリポイント内の注入可能なメンバのすべてが満たされていることを確認し、モジュールが完全なオブジェクトグラフを作成するようにします。 – SeanPONeil

+0

フラグを含むように見えるのは、実際に指定されたモジュールが含まれているようです。なぜなら、アプリが正常に動作しているときに注入するからです。 – Axxiss

+1

あなたは、おそらくアクティビティの代わりにオブジェクトグラフにテストケースを注入していますか? – SeanPONeil

答えて

3

@AndyDennieが彼のコメントで言ったように、私はテストクラスで注射をしていませんでした。 setUp()に作成するのではなく、テスト対象のアクティビティを注入することで問題は解決しました。 (関連するコード)

私の現在のテストケースは次のようになります。

@RunWith(RobolectricTestRunner.class) 
public class SimCardActivityTest { 

    @Inject 
    private SimCardActivity mActivity; 

    private TelephonyManager mTelephonyManager; 

    @Before 
    public void setUp() throws Exception { 
     ObjectGraph.create(new ServiceModule(Robolectric.application), 
          new ServiceTestModule()).inject(this); 
    } 

    @Module(
      includes = {ServiceModule.class }, 
      overrides = true, 
      entryPoints = {SimCardActivity.class, SimCardActivityTest.class} 
    ) 
    static class ServiceTestModule { 
     public static TelephonyManager TELEPHONY_MANAGER = 
      Mockito.mock(TelephonyManager.class); 

     @Provides 
     @Singleton 
     TelephonyManager provideTelephonyManager(){ 
      return TELEPHONY_MANAGER; 
     } 
    } 
} 
+0

マイナーコメント:TelephonyManagerに@Singletonを提供すると、静的インスタンス(TELEPHONY_MANAGER)を宣言して返す必要はありません。提供メソッドでMockito.mock(TelephonyManager.class)を返すよう指示することができます。これは一度だけ実行されるためです。 – GaRRaPeTa

関連する問題