2017-01-03 9 views
0

Androidアプリケーションの機能テストを書いて、異なるログインフローをテストしようとしています。Androidの機能テスト:テスト間のデータベースのクリア

私ができることをしたいのは、最初のアクティビティから始め、特定のユーザーとのログインをシミュレートし、最初のアクティビティからもう一度開始し、別のユーザーとのログインをシミュレートすることです。

私が実行している問題は、特定のユーザー情報をローカルデータベースに書き込むときに、2番目のユーザーをログオンしようとすると、データベースに既に最初のユーザーの情報とテストが含まれていることです失敗する。

私が望むと思うのは、テスト実行の間にデータベースをクリアする方法です。

ActivityTestRuleを使用してデータベースを削除する方法が見つかりましたが、実際にはデータベースを消去するのではなく、database.dbファイルが実際に削除されます。これにより、データベースが存在しないため、2番目のテストも失敗します。

テスト実行の間にデータベースをクリアする明確な方法はありますか?

私は考えることができる唯一のことは、ログインフローごとに1つのテストクラスを持つことで、アプリケーションは実際にテスト実行の間にプロセスを再起動する必要があります(テスト実行の終わりにdbを削除する)は、毎回新しいデータベースでデータベースを起動することができます。

答えて

0

問題は、私のアプリケーションクラスのonCreate()メソッドでは、データベースのインスタンスを作成するダガーがあるようです。私のテストコードでは、そのデータベースファイルを削除します。したがって、test1を実行する前に、アプリケーションのonCreate()が実行され、データベースが構築されます。 test1が終了すると、データベースファイルが削除されます。 test2が起動すると、アプリケーションの処理がテストメソッド間で終了しないため、アプリケーションのonCreate()は実行されません。したがって、test2がdbにアクセスしようとすると、エラーがスローされます。

は、この問題を解決するために、私は私のティアダウンに次のコードを追加しました()メソッドは:test1の実行は、その後、ティアダウン方式でデータベースファイルが削除されます

@After 
     public void tearDown() throws Exception { 
     deleteAllAppData(); 
     MyApplication application = ((MyApplication) activityActivityTestRule.getActivity().getApplicationContext()); 
     InstrumentationRegistry.getInstrumentation().callApplicationOnCreate(application); 
    } 

    private void deleteAllAppData() { 
     activityActivityTestRule.getActivity().deleteDatabase(DbHelper.DATABASE_NAME); 
     PreferenceManager 
      .getDefaultSharedPreferences(activityActivityTestRule 
        .getActivity() 
        .getApplicationContext()) 
      .edit() 
      .clear() 
      .apply(); 
    } 

今何が起こるかがされた後、私はハンドルを取得します現在のApplicationクラスに追加し、InstrumentationRegistryオブジェクトを使用してApplicationクラスのonCreate()を呼び出します。これはプロセスの再起動をシミュレートするので、データベースが再び作成され、次の機能テストの準備が整いました。