Intereting Posts
Android: Bitmap to Byte Array и обратно: SkImageDecoder :: Factory возвращен null Как остановить тосты и alertDialog потерять фокус на мой фильтр EditText Масштабировать изображение, сохраняя его соотношение сторон в фоновом режиме Android ActionBar – нажмите пользовательский вид в нижней части экрана. Изменение стиля кодирования из-за производительности Android GC, насколько далеко? Автоматическая загрузка автономного языка распознавания речи на Android Как исправить: «HAX не работает, а эмулятор работает в режиме эмуляции» Проверьте, увеличилось ли значение целого числа? Appcelerator 4 не может найти Android SDK на Mac Не удалось скомпилировать мой Android-проект Использование API Google Адресов Несколько диалогов Smart Lock при изменении ориентации Как добавить проект библиотеки в Android Studio? Android Использование значения Color Resource в коде Напишите приложение, которое может использовать плагины

Тест для Android Studio Unit SQLiteDataBase равен нулю

Я новичок в модульном тестировании, и я хочу проверить свой SQLiteDataBase.

У меня есть класс с именем MySQLiteHelper, который расширяет SQLiteOpenHelper . У меня есть класс с именем LocationDataHandler, который я использую для добавления или удаления элементов из моей базы данных. И у меня есть класс LocationDataHandlerTest , который расширяет AndroidTestCase , чтобы проверить класс LocationDataHandler .

Я пытаюсь проверить свою базу данных SQLite, но, похоже, я немного потерялся между всеми различными контекстами.

Вот мой код:

//Context context = new Activity(); //IsolatedContext context = getMockContext(); //Context context = new MockContext(); //Context context = getInstrumentation().getContext(); Context context = getContext(); helper = new MySQLiteHelper(context); assertNotNull(helper); SQLiteDatabase db = helper.getWritableDatabase(); assertNotNull(db); <---- it fails here ! 

Как вы можете видеть, я пробовал со многими различными контекстами, с которыми я видел, как люди используют и работают. Я действительно не понимаю, почему это не работает в моем случае.

Моя проблема в том, что тест не работает на строке «assertNotNull (db)»; Это означает, что я никогда не смогу извлечь базу данных.

Я делаю это неправильно? Я не использую правильный контекст?

Изменить : Вот мой logcat:

 junit.framework.AssertionFailedError at junit.framework.Assert.fail(Assert.java:55) at junit.framework.Assert.assertTrue(Assert.java:22) at junit.framework.Assert.assertNotNull(Assert.java:256) at junit.framework.Assert.assertNotNull(Assert.java:248) at junit.framework.TestCase.assertNotNull(TestCase.java:417) at com.databerries.LocationDataHandlerTest.testAddLocation(LocationDataHandlerTest.java:72) 

Solutions Collecting From Web of "Тест для Android Studio Unit SQLiteDataBase равен нулю"

Да, это проблема контекста. Все эти контексты (включая те, которые вы закомментировали) равны нулю.

Вы можете создать контекст:

 context = new MockContext(); 

К той же базе данных (или другим ресурсам) в качестве приложения вы можете использовать (поскольку вы используете AndroidTestCase):

 context = getInstrumentation().getContext(); 

Существует правильный способ создания и использования RoamingDelegatingContext, но он не кажется вам необходимым для вашего теста.

Вы можете подумать о том, чтобы прочитать Основы тестирования Android, чтобы помочь понять некоторые проблемы с тестированием и уровень необходимых ресурсов / ресурсов.

Расширьте свой тестовый класс из AndroidTestCase и используйте mContext например, пример кода:

 public class MyDbHelperTest extends AndroidTestCase { private DatabaseHelper db; @Before public void setUp() throws Exception { super.setUp(); db = DatabaseHelper.getInstance(mContext); } @After public void tearDown() throws Exception { db.close(); super.tearDown(); } public void testOpeningDb() throws Exception { assertNotNull(db); SQLiteDatabase sqliteDb = db.getWritableDatabase(); assertNotNull(sqliteDb); } 

}

mContext наследуется к этому классу из класса AndroidTestCase . Это будет работать, поскольку у меня была такая же проблема.

Во время тестирования в android мы обычно издеваемся над файлом и базой данных. Если мы тестируем на реальном устройстве, мы не хотим влиять на существующие файлы. Таким образом, в этих случаях использование контекста направляет вызовы файловой системе нашего конкретного приложения.

Следовательно, мы отбрасываем эти типы операций, используя RenamingDelegatingContext . Этот класс делегирует заданный контекст, но выполняет операции с базами данных и файлами с помощью переименованного имени базы данных / файла. Вы должны использовать контекст следующим образом:

 RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_db"); helper = new MySQLiteHelper(context); assertNotNull(helper); SQLiteDatabase db = helper.getWritableDatabase(); assertNotNull(db); 

Для тестирования с Android Studio,

Вы должны использовать MockContext вместо MockContext .

Используйте InstrumentationTestCase .

Для получения дополнительной информации см. Этот ответ. https://stackoverflow.com/a/29063736/1020456

Вот мой код.

 public class DatabaseHelperTest extends InstrumentationTestCase{ private DatabaseHelper db; @Before public void setUp() throws Exception { super.setUp(); MockContext context = new MockContext(); db = DatabaseHelper.getInstance(context); } @After public void tearDown() throws Exception { db.close(); super.tearDown(); } public void testInsertUserInteraction() throws Exception { assertNotNull(db.getReadableDatabase()); //should pass } 

}