7

Espresso を使用したインストルメンテーション テストの作成に問題があります。アプリの起動時にアカウント ピッカーがポップアップ表示されるアクティビティがあります (メイン アクティビティ)。顧客が (ダイアログで) キャンセルをクリックすると、ピッカーが再びポップアップします。ユーザーが [追加] をクリックすると、アクティビティ結果で結果が取得されます。

そのピッカーを含むエスプレッソで簡単なテストを作成する方法がわかりません。MainActivity を使用してインストルメンテーション テストを作成すると、次のメッセージが表示されました: No activities in stage RESUMED...

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>{
    MainActivity myActivity;
    public MainActivityTest(){
        super(MainActivity.class);
    }

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

    public void testAccountPicker(){
        onView(withText("Choose an account")).check(matches(isDisplayed()));
    }
}

誰かが同様の問題を抱えていましたか?

事前にご回答いただきありがとうございます。

4

3 に答える 3

3

それは難しいものです:)。ここでの問題は、フローがアプリケーションを離れると (Google アカウント ピッカーは外部アプリケーションです)、Espresso がテストを終了することです。アカウント ピッカーはパッケージからのアクティビティであるcom.google.android.gmsため、外部です。テストが開始されると、テストは終了し、ダイアログで何かを照合することはできなくなります。

テストを実行可能にするための解決策は 3 つあります。

  • アプリでクラスパス置換を使用してインテントを偽造する。また
  • アプリの「テスト可能性」を修正します。また
  • Daggerのような依存性注入の使用

クラスパス置換の使用方法を示します。この手法は非常に単純です。たとえば、インテントの作成を別のクラスに分離し、IntentsFactoryテスト中にそのクラスをオーバーライドする必要があります。

あなたの工場が入っcom.yourapp.factories.IntentsFactoryているとしましょう。それは次のようなものです:

public class IntentsFactory {
    public static Intent getAccountPickerIntent (Context context) {
        return AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
    }
}

同じ名前とメソッドを持つパッケージをテスト アプリ (たとえばcom.yourapp.tests) で作成する必要がありますが、それは別のインテント、モック/ダミーのものを返します。

public class IntentsFactory {
    public static Intent getAccountPickerIntent (Context context) {
        return new Intent(context, MyDummyAccountPickerActivity.class);
    }
}

テストが実行されるたびに、クラスパスで「最も近い」クラス、つまりテストの IntentsFactory が使用されます。フローを別のアプリに送信するインテントを返す代わりに、フローはプロジェクトのクラスに移動し、Espresso はテストを終了しません。

ここでの唯一の注意点は、フレームワーク クラスによって返されるものと同様MyDummyAccountPickerActivityの結果を返すを作成する必要があることです。Bundleアクティビティはアプリのマニフェストに存在する必要があり、次のコマンド ラインを使用して、エミュレータの Dalvik ランタイムにクラスパス (これこのリンクを確認してください) の置換を許可するように指示する必要があります。

adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd

そして、テストを実行します。

カメラをテストするために同様の問題があり、Espressoフォーラムで徹底的に議論されています

于 2014-02-18T12:08:26.150 に答える