2016-05-15 28 views
0

我發現了很多類似的問題,但都沒有完全回答我的問題。 在android中單元測試SQLliteOpenHelper類的最佳方式是什麼?測試SQLiteOpenHelper類時上下文null null

我的錯誤:

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)',並且在任何情況下都被棄用。使用'InstrumentationRegistry.getTargetContext()'獲取正在測試的應用程序或庫代碼的'Context'。 – CommonsWare

+0

已添加擴展堆棧跟蹤 –

回答

3

getContext()似乎被返回null。正如我在評論中指出的那樣,AndroidTestCase可能不適用於@RunWith(AndroidJUnit4.class),並且在任何情況下都被棄用。使用InstrumentationRegistry.getTargetContext()獲取正在測試的應用程序或庫代碼的Context

+1

'InstrumentationRegistry.getTargetContext()'是解決方案。我沒有看到任何提到'AndroidtestCase'在文檔中被棄用的想法? –

+0

@DavidFinder:在N Developer Preview中不推薦使用所有原始測試類(例如'AndroidTestCase')。據推測,它們將在轉向下一個運輸版本的Android時被棄用。 – CommonsWare