2016-05-15 10 views
0

私は多くの同様の質問を見つけましたが、私の質問に正確に答えたものはありません。 アンドロイドでSQLliteOpenHelperクラスの単体テストを行う最善の方法は何ですか?SQLiteOpenHelperクラスをテストするときにコンテキストヌル

マイエラー:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean 
android.content.Context.deleteDatabase(java.lang.String)' on a null object reference 
at android.test.RenamingDelegatingContext.openOrCreateDatabase(RenamingDelegatingContext.java:157) 
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
at uk.co.ticking_clock.reptilekeeper.data.AnimalOperationsTest.pet_defaultEntries(AnimalOperationsTest.java:36) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 

コード:

@RunWith(AndroidJUnit4.class) 
public class DatabaseOperationsTest extends AndroidTestCase { 
private MyDbHelper testDb; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 
    RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_"); 
    testDb = MyDbHelper.getInstance(context); 
} 

@After 
public void tearDown() { 
    testDb = null; 
} 

@Test 
public void pet_defaultEntries() { 
    SQLiteDatabase db = testDb.getWritableDatabase(); 
    Cursor textDb = db.rawQuery("SELECT name FROM tableOne", null); 

    int expected = 2; 
    int actual = textDb.getCount(); 

    Assert.assertTrue(expected == actual); 

} 
} 
+1

あなたのエラーは 'deleteDatabase()'呼び出しから来ています。あなたの質問のコードには 'deleteDatabase()'呼び出しはありません。 Javaスタックトレース全体と、そのスタックトレースで参照されているソースコードを投稿してください。また、 'AndroidTestCase'は' @RunWith(AndroidJUnit4.class) 'では動作しない可能性があり、いずれにしても非難されています。テストされているアプリケーションまたはライブラリコードの 'Context'を取得するには、' InstrumentationRegistry.getTargetContext() 'を使用してください。 – CommonsWare

+0

展開スタックトレースを追加 –

答えて

3

getContext()nullを返すように見えるでしょう。コメントに記載されているように、AndroidTestCase@RunWith(AndroidJUnit4.class)で動作しない可能性があり、いずれにしても廃止されました。テストされているアプリケーションまたはライブラリコードについては、InstrumentationRegistry.getTargetContext()を使用してContextになります。

+1

'InstrumentationRegistry.getTargetContext()'が解決策でした。私は 'AndroidtestCase'はドキュメントの考えで廃止されているという言及はありませんか? –

+0

@DavidFinder:元のテストクラス(例: 'AndroidTestCase')はすべてN Developer Previewで廃止予定です。おそらく、Androidの次の出荷バージョンになると、それらは非推奨になります。 – CommonsWare

関連する問題