база данных для unitTest - PullRequest
       7

база данных для unitTest

0 голосов
/ 16 октября 2018

Для своих модульных тестов я собрал реальные данные датчиков в базе данных 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?Бонусные баллы за оперативную память, потому что я буду сброшен после теста в любом случае.

1 Ответ

0 голосов
/ 16 октября 2018

Я нашел решение:

Преобразование базы данных в операторы ввода

sqlite testdb.sqlite .dump > testdb.sql

поместите этот файл в androidTest/assets/databases/, затем создайте базу данных:

    class MyDatabaseOpenHelper(val context: Context,
                           version: Int = 1) : SQLiteOpenHelper
                                                  (context,
                                                   null,
                                                   null,
                                                   version,
                                                   null) {
    override fun onCreate(db: SQLiteDatabase?) {
        BufferedReader(InputStreamReader(context.getAssets().open("databases/testdb.sql"))).apply {
            lines().forEach {
                try {
                    db!!.execSQL(it)
                } catch (e: SQLiteException) {
                    Log.w("read test db", e)
                }
            }
            close()
        }
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        //noop load from file
    }
}

Не предоставляя имя, мы создаем базу данных в памяти из операторов sql.

Это решение не идеально, поскольку оно требует ручного шага при обновлении тестовой базы данных, ноэто работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...