web-dev-qa-db-ja.com

Androidコンテキストを必要とする単体テスト

私は最初のAndroidデータベースバックエンドを書いており、データベースの作成の単体テストに苦労しています。

現在、私が直面している問題は、SQLiteOpenHelperの実装に渡す有効なContextオブジェクトを取得することです。 TestCaseを拡張するクラスでContextオブジェクトを取得する方法はありますか?私が考えた解決策は、TestCaseのセットアップメソッドでアクティビティをインスタンス化し、そのアクティビティのコンテキストをテストメソッドがアクセスできるフィールド変数に割り当てることですが、もっと簡単な方法があるはずです。

ご意見ありがとうございます!

メイシー

58
Macy Abbey

AndroidTestCase に切り替えてみてください。ドキュメントを見ると、SQLiteOpenHelperに渡す有効なコンテキストを提供できるはずです。

編集:テストはエミュレーター(または実際のデバイス)で実行されるため、Eclipseの「Android Test Project」でテストをセットアップする必要がある可能性があることに注意してください。

41
Erich Douglass

InstrumentationRegistry メソッドを使用してコンテキストを取得できます。

InstrumentationRegistry.getTargetContext()-ターゲットアプリケーションのアプリケーションContextを提供します。

InstrumentationRegistry.getContext()-このインストルメンテーションのパッケージのContextを提供します。


AndroidXの場合は、InstrumentationRegistry.getInstrumentation().getTargetContext()またはInstrumentationRegistry.getInstrumentation().getContext()を使用します。

26
birdy

AndroidTestCase:getContext()メソッドを使用すると、私の経験ではスタブコンテキストのみが得られます。私のテストでは、メインアプリで空のアクティビティを使用し、それを介してContextを取得しています。また、テストスイートクラスをActivityInstrumentationTestCase2クラスで拡張しています。私のために働くようです。

public class DatabaseTest extends ActivityInstrumentationTestCase2<EmptyActivity>
    EmptyActivity activity;
    Context mContext = null;
    ...
    @Before
    public void setUp() {
        activity = getActivity();
        mContext = activity;
    }
    ... //tests to follow
}

他のみんなは何をしますか?

5
Tim Kist

MockContext から派生し、たとえばgetResources()MockResources を返すことができます。 、有効な ContentResolver on getContentResolver()など。これにより、いくつかの単体テストが苦痛を伴います。

別の方法は、たとえば Robolectric を実行することです。これは、全体をシミュレートしますAndroid OS。 system tests:実行が非常に遅くなります。

3
Wernight

ApplicationTestCaseまたはServiceTestCaseを使用する必要があります。

3
Neil

AndroidTestCaseを拡張してAndroidTestCase:getContext()を呼び出すと、Contextを取得してSQLiteDatabaseで使用できるようになりました。

唯一の問題は、それが作成および/または使用するデータベースが本番アプリケーションで使用されるデータベースと同じになるため、おそらく両方に異なるファイル名を使用することです

例えば。

  public static final String    NOTES_DB      = "notestore.db";
  public  static final String   DEBUG_NOTES_DB = "DEBUG_notestore.db";
2
Ian

あなたのテストは単体テストではありません!!!

必要なときに

  • 環境
  • ストレージの読み取りまたは書き込み
  • アクセスネットワーク
  • または、設定を変更して機能をテストします

あなたは単体テストを書いていません。

テストをandroidTestパッケージで記述する必要があります

0
Ehsan

最初に(androidTest)の下にテストクラスを作成します。

次のコードを使用します。

public class YourDBTest extends InstrumentationTestCase {

private DBContracts.DatabaseHelper db;
private RenamingDelegatingContext context;

@Override
public void setUp() throws Exception {
    super.setUp();
    context = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test_");
    db = new DBContracts.DatabaseHelper(context);
}

@Override
public void tearDown() throws Exception {
    db.close();
    super.tearDown();
}

@Test
public void test1() throws Exception {
    // here is your context
    context = context;
}}
0
lidox