12

Mockito & Daggerで Activity をテストしようとしています。アプリケーションのアクティビティに依存関係を挿入できましたが、アクティビティをテストするときにアクティビティにモックを挿入できませんでした。Activity を注入してテストするか、getActivity() で作成する必要がありますか?

public class MainActivityTest extends
    ActivityInstrumentationTestCase2<MainActivity> {

@Inject Engine engineMock;
private MainActivity mActivity;
private Button mLogoutBtn;


public MainActivityTest() {
    super(MainActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();

    // Inject engineMock to test
    ObjectGraph.create(new TestModule()).inject(this);
}

@Override
protected void tearDown() {
    if (mActivity != null)
        mActivity.finish();
}

 @Module(
 includes = MainModule.class,
 entryPoints = MainActivityTest.class,
 overrides = true
 )

static class TestModule {
    @Provides
    @Singleton
    Engine provideEngine() {
        return mock(Engine.class);
    }
}

@UiThreadTest
public void testLogoutButton() {

    when(engineMock.isLoggedIn()).thenReturn(true);

    mActivity = getActivity();
    mLogoutBtn = (Button) mActivity.findViewById(R.id.logoutButton);

    // how to inject engineMock to Activity under test?
    ObjectGraph.create(new TestModule()).inject(this.mActivity);

    assertTrue(mLogoutBtn.isEnabled() == true);
}
}
4

3 に答える 3

6

機能テストには Mockito と Dagger を使用します。重要な概念は、テスト クラスが ActivityInstrumentationTestCase2 ではなく、ActivityUnitTestCase から継承することです。後者のスーパークラスは、Activity の onStart() ライフサイクル メソッドを呼び出して、テストの注入をブロックし、依存関係を二重にしますが、最初のスーパークラスを使用すると、ライフサイクルをよりきめ細かく処理できます。

アクティビティとフラグメントのテストに dagger-1.0.0 と mockito を使用した私の作業例を以下で確認できます。

https://github.com/IIIRepublica/android-civicrm-test

テスト中のプロジェクトは次の場所にあります。

https://github.com/IIIRepublica/android-civicrm

これがお役に立てば幸いです

于 2013-05-14T08:55:12.503 に答える
1

すべてをまとめて、短剣でテストする方法を示すデモ アプリを作成しました: https://github.com/vovkab/dagger-unit-test

詳細を含む以前の回答は次のとおりです。
https://stackoverflow.com/a/24393265/369348

于 2014-06-24T22:17:35.240 に答える