私は最初のAndroidデータベースバックエンドを書いており、データベースの作成の単体テストに苦労しています。
現在、私が直面している問題は、SQLiteOpenHelperの実装に渡す有効なContextオブジェクトを取得することです。 TestCaseを拡張するクラスでContextオブジェクトを取得する方法はありますか?私が考えた解決策は、TestCaseのセットアップメソッドでアクティビティをインスタンス化し、そのアクティビティのコンテキストをテストメソッドがアクセスできるフィールド変数に割り当てることですが、もっと簡単な方法があるはずです。
ご意見ありがとうございます!
メイシー
AndroidTestCase に切り替えてみてください。ドキュメントを見ると、SQLiteOpenHelperに渡す有効なコンテキストを提供できるはずです。
編集:テストはエミュレーター(または実際のデバイス)で実行されるため、Eclipseの「Android Test Project」でテストをセットアップする必要がある可能性があることに注意してください。
InstrumentationRegistry
メソッドを使用してコンテキストを取得できます。
InstrumentationRegistry.getTargetContext()
-ターゲットアプリケーションのアプリケーションContext
を提供します。
InstrumentationRegistry.getContext()
-このインストルメンテーションのパッケージのContext
を提供します。
AndroidXの場合は、InstrumentationRegistry.getInstrumentation().getTargetContext()
またはInstrumentationRegistry.getInstrumentation().getContext()
を使用します。
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
}
他のみんなは何をしますか?
MockContext から派生し、たとえばgetResources()
で MockResources を返すことができます。 、有効な ContentResolver on getContentResolver()
など。これにより、いくつかの単体テストが苦痛を伴います。
別の方法は、たとえば Robolectric を実行することです。これは、全体をシミュレートしますAndroid OS。 system tests:実行が非常に遅くなります。
ApplicationTestCaseまたはServiceTestCaseを使用する必要があります。
AndroidTestCaseを拡張してAndroidTestCase:getContext()を呼び出すと、Contextを取得してSQLiteDatabaseで使用できるようになりました。
唯一の問題は、それが作成および/または使用するデータベースが本番アプリケーションで使用されるデータベースと同じになるため、おそらく両方に異なるファイル名を使用することです
例えば。
public static final String NOTES_DB = "notestore.db";
public static final String DEBUG_NOTES_DB = "DEBUG_notestore.db";
あなたのテストは単体テストではありません!!!
必要なときに
あなたは単体テストを書いていません。
テストをandroidTest
パッケージで記述する必要があります
最初に(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;
}}