对于我的单元测试,我已经在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
加载数据库?内存奖励积分,因为测试后我将被丢弃。
答案 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语句创建内存数据库。
此解决方案并不完美,因为在更新测试数据库时需要手动进行操作,但是对我有用。