6

TelephonyManagerDaggerでサービスを注入しようとしています。私はこのサンプルに従っています。クラスを拡張してグラフを作成し、含まれる場所Applicationを定義しました。将来、他のモジュールが含まれる予定です。ApplicationModuleServiceModule

編集:

Activityこれで、システム サービスが問題なくに注入されました。の中に行方不明でしFinderApplication.inject(this)Activity。インジェクションがありますが、 でのテストではまだインジェクションしませんRobolectric。この投稿の最後にテスト ケースを追加しました。

Edit-2: ApplicationModule削除および作成BaseActivity:

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

オンonCreateメソッド。私が得ているエラーは次のとおりです。

原因: java.lang.NoSuchMethodException: ServiceModule.()

しかし、空のコンストラクターを定義すると、注入されたクラスが必要なときに null ポインターが返されます。

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;
        }
    }
}
4

1 に答える 1

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;
        }
    }
}
于 2013-03-08T19:15:17.030 に答える