Intereting Posts

Тест для 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) 

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

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

 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 } 

}