Для своих модульных тестов я собрал реальные данные датчиков в базе данных SQLite.Мне нужны эти данные для создания моих тестов.Я попытался двумя способами ниже, но безуспешно.
Я действительно озадачен этой проблемой, потому что обычно SQLiteOpenHelper
загружает любую базу данных в /data/data/packageName/databases/
безупречно.
Я пытался android-sqlite-asset-helper :
val targetContext by lazy { InstrumentationRegistry.getTargetContext() }
val testContext by lazy { InstrumentationRegistry.getContext() }
const val TEST_DB_NAME = "testdb.sqlite"
const val VERSION = 1018
class TestDatabase(context: Context) :
SQLiteAssetHelper(context, TEST_DB_NAME, null, null, VERSION) {
...
}
, но ни один из контекстов не работает.При использовании testContext
он не может записать базу данных в файловую систему, а при targetContext
он не может получить доступ к androidTest/assets/databases/testdb.sqlite
.
Когда я пытаюсь скопировать ее вручную (, как предложено ) с помощью:
const val DB_PATH = "/data/data/de.leo.smartTrigger/databases/"
@Throws(IOException::class)
private fun copyDatabase(testContext: Context) {
val inputStream = testContext.getAssets().open("databases/$TEST_DB_NAME")
val outFileName = DB_PATH + TEST_DB_NAME
val outputStream = FileOutputStream(outFileName)
val buffer = ByteArray(1024)
var length: Int = inputStream.read(buffer)
while (length > 0) {
outputStream.write(buffer, 0, length)
length = inputStream.read(buffer)
}
outputStream.flush()
outputStream.close()
inputStream.close()
}
//after
copyDatabase(testContext)
val db = SQLiteDatabase.openDatabase(DB_PATH + TEST_DB_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY)
//yields an empty database although
File(DB_PATH + TEST_DB_NAME).exists() == true // true
Как загрузить базу данных из androidTest/assets/databases/testdb.sqlite
?Бонусные баллы за оперативную память, потому что я буду сброшен после теста в любом случае.