2016-05-15 25 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