ライブラリプロジェクトから「派生」するテスト実装を実行して、Androidテストを実行します(baselibと「具体的なアプリプロジェクト」を含むマルチモジュールプロジェクトがあるため)。テストの実装は、これらの具体的なアプリ プロジェクトの 1 つであり、InstrumentationTestCase によって起動されます。このテスト ケースでは、RoboGuice によるライブラリ プロジェクトからいくつかの部分をモックします。つまり、モック化されたクラス (永続化処理、データベース処理など) を使用して baselib の「実際の」実装を実行します。これを行うには、デバイスで同じアプリを 2 回起動することはできないため、すべてのテスト ケースでテスト インスタンス全体を閉じて再起動する必要があります。これらのテストは、ある種のワークフローをテストするため、Junit テストよりも統合テストですが、それをテストする他の可能性はありません。Android テストでの JUnit の可能性は非常に限られているように見えるためです。現時点では、同時に実行できるテスト ケースは 1 つだけです。複数のテスト ケースを実行すると、テスト全体がハングするからです。テストがフリーズする原因が構成の変更 (プライベート メソッドを参照) であるかどうかは既に確認しましたが、これが原因ではありません。TearDown メソッドで私の試みを参照してください。走れない
getInstrumentation().finish(0, new Bundle());
私が得るので
テストを完了できませんでした。理由: 'テストの実行が完了しませんでした。3 回のテストが予想され、1' を受け取りました
私も走れません
getInstrumentation().callActivityOnDestroy(アクティビティ);
ここにはアクティビティがないためです。さらに、StartTestActivity はテストの最後に実行される別のアクティビティ「MainMenuActivity」を起動するため、起動時に起動されるアクティビティ「StartTestActivity」は、テストの終了時に実行される同じアクティビティではありません。Instrumentation.ActivityMonitorの使用についてはすでに考えましたが、これでは必要な機能が提供されません。
それにもかかわらず、起動時にテスト全体が行うのと同じテスト条件で、すべてのテスト ケースで何らかの方法で開始したいのですが、InstrumentationTestCase がバックグラウンドで何をしているのかわからないため、インストルメンテーション全体を再起動する方法がわかりません。設定。どういうわけかテスト インスタンスを停止して再起動する必要がありますか、それとももっと良い解決策がありますか? 何か案は?(ちなみに、すべてのテスト自体は正常に実行されるため、テスト自体の問題ではありません)。
public class WorkflowModule1Test extends InstrumentationTestCase
{
private PersistenceManagerMock persistenceManager;
@Override
protected void setUp() throws Exception
{
super.setUp();
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
if (persistenceManager != null)
{
persistenceManager.clear();
}
}
public void testSaveLocaleEN() throws PersistenceException
{
updateLocaleConfiguration(Locale.ENGLISH);
Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getInstrumentation().startActivitySync(intent);
persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);
List<Entity> entities = persistenceManager.getEntities();
assertTrue(entities.size() == 1);
assertTrue(entities.get(0) instanceof LanguageUsageRel);
assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("EN"));
}
public void testSaveLocaleDE() throws PersistenceException
{
updateLocaleConfiguration(Locale.GERMAN);
Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getInstrumentation().startActivitySync(intent);
persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);
List<Entity> entities = persistenceManager.getEntities();
assertTrue(entities.size() == 1);
assertTrue(entities.get(0) instanceof LanguageUsageRel);
assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("DE"));
}
private void updateLocaleConfiguration(Locale locale)
{
Locale.setDefault(locale);
Configuration configuration = new Configuration();
configuration.locale = locale;
getInstrumentation().getContext().getResources().updateConfiguration(configuration, getInstrumentation().getContext().getResources().getDisplayMetrics());
}
}