2

ここで明らかな何かが欠けているに違いありません:

Robotium の助けを借りて、デバイスでインストルメンテーション テスト ケースを実行しています。ある時点で、テスト対象のアプリによって、既定の電子メール作成アクティビティが起動されます。

私が知りたいのは、そのアクティビティを閉じて、アプリのアクティビティを再び表示するにはどうすればよいですか? これが必要な理由の少なくとも1 つは、現在のテスト ケースが完了した後、電子メール アクティビティがフォアグラウンドにとどまり、次のテスト ケースが適切に実行されないことです。

メールアクティビティに必要なバックキーを送信しようとしましたが、this.sendKeys(KeyEvent.KEYCODE_BACK)またはsolo.goBack()運がありませんでした。

パッケージ内の最上位アクティビティへの参照を実行solo.getCurrentActivity()または取得した場合、実際のフォアグラウンド アクティビティを取得する方法はありません。また、言及されたものは、メールのアクティビティではなく、私のアクティビティに直接行きます。this.getActivity()sendKeys/goBack

アプリが Play ストアのメイン アクティビティを起動すると、同じ問題が発生します。
電子メール アクティビティはテスト対象のパッケージの一部ではなく、これが問題の一部である可能性があることに気付きました。

それで、電子メール活動を閉じる方法はありますか?

編集
今のところ、@Joe Malinの最初の提案に固執しています:

私のViewModel(またはコントローラー)には、private static boolean _productionMode = true; テスト中にのみ使用されるヘルパーメソッド(内部ヘルパークラスの場合はより良い)があります:

public void dontLaunchExternalApps()
{
  _productionMode = false;
}

次に、ViewModel の通常のメソッドで次のようにします。

if (_productionMode)
{
   launchSomeExternalApp();
}
else
{
   // Do Nothing Or Set Some Internal Flag
}
4

2 に答える 2

1

それを行う良い方法はありません。Androidインストルメンテーションフレームワークは、実際にはAndroidコンポーネントの単体テストを目的としています。制御がコンポーネントから渡されると、他のフレームワークが引き継ぐ必要があります。

おそらく、実際のインテントではなくスタブ電子メールインテントを送信するようにアクティビティに指示する拡張データを使用して、最初のアクティビティを開始できます。本当の問題は、電子メールアクティビティを閉じることではなく、それをあざけることで、期待どおりの結果を取り戻すことができます。残念ながら、Androidコンポーネントではモックはサポートされていません。これを回避する方法は、ほとんどの操作をPOJOサブクラスに委任してから、それらをモックすることです。

于 2012-11-12T20:38:03.083 に答える
1

テストでインテント フィルターを作成して、正しいインテントが起動されたことを確認し、結果を返す処理を行うか、これをテストするためだけのアプリを作成できます。たとえば、電子メールのインテントを処理し、これをシステムのデフォルトに設定するアプリこのアプリは実際には GUI を持たず、必要な結果を自動的に返すことができます。ハードコードされているか、読み取り可能な場所にあるファイルに基づいているか、インテント内の追加情報としても返されます。

次に例を示します。

//set up the filter
final Instrumentation inst = getInstrumentation();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW);
intentFilter.addDataScheme("http");
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE);

//Set up the monitor
//THE BOOLEAN ON THE END TELLS THE SYTEM TO BLOCK IT FROM OCCURING, you probably want true here
ActivityMonitor monitor = inst.addMonitor(intentFilter, null, true);

assertEquals(0,monitor.getHits()); 

//click the link here with whatever framework you are using
solo. clickOnText("link text")

//Wait for the activity to get hit
monitor.waitForActivityWithTimeout(2000); 

//Here is where you actually check it happened
assertEquals(1, monitor.getHits()); 
inst.removeMonitor(monitor);
于 2012-11-14T08:29:15.730 に答える