2016-05-15 3 views
0

Я нашел много похожих вопросов, но ни один из них точно не ответил на мой вопрос. Каков наилучший способ модульного тестирования класса SQLliteOpenHelper в android?Контекст null при тестировании 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) 'и в любом случае устарел. Используйте 'InstrumentationRegistry.getTargetContext()', чтобы получить «Context» для тестируемого приложения или библиотечного кода. – CommonsWare

+0

расширенная трассировка стека добавлена ​​ –

ответ

3

getContext(), казалось бы, возвращение null. Как я заметил в комментарии, AndroidTestCase может не работать с @RunWith(AndroidJUnit4.class) и в любом случае устарел. Используйте InstrumentationRegistry.getTargetContext(), чтобы получить код Context для тестируемого приложения или библиотеки.

+1

'InstrumentationRegistry.getTargetContext()' было решением. Я не вижу упоминания о том, что «AndroidtestCase» не рекомендуется в документах? –

+0

@DavidFinder: все исходные классы тестов (например, 'AndroidTestCase') устарели в N Developer Preview. Предположительно, они будут оставаться устаревшими, когда это превратится в следующую версию Android. – CommonsWare

Смежные вопросы