unitTest的数据库资产

时间:2018-10-16 00:47:36

标签: android kotlin sqlite integration-testing android-testing

对于我的单元测试,我已经在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

当我尝试通过以下方式手动复制(as suggested by)时:

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 :(得分:1)

我找到了解决方法:

Convert the database to input-statements

    abstract class Point2D
    {
        public virtual string X { get; set; }
    }

    abstract class Point3D
    {
        public virtual string X { get; set; }
        public virtual string Y { get; set; }
    }

    interface IPoint3D<T>
    {
         T GetT();
    }

    class Point : Point2D, IPoint3D<Point3D>
    {

        public Point2D GetPoint2D()
        {
         return this;
        }

        public Point3D GetT()
        {
            return null; // how to return point3D?
        }
    }

将此文件放入sqlite testdb.sqlite .dump > testdb.sql 中,然后创建数据库:

androidTest/assets/databases/

通过不提供名称,我们从sql语句创建内存数据库。

此解决方案并不完美,因为在更新测试数据库时需要手动进行操作,但是对我有用。