【发布时间】:2018-07-12 14:22:18
【问题描述】:
在尝试为我正在处理的项目开发一些单元测试时,我遇到了需要测试 DB 行为的墙。 我正在尝试创建一个内存数据库(SQLite)
虽然我认为这个相当基本的测试会按照要求进行,但它总是返回一个 NULL 数据库,这不是我所期望的。
package be.wgkovl.evdt.Util;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.test.mock.MockContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith( PowerMockRunner.class )
public class ClassForStack {
SQLiteDatabase db;
Context context;
private Cursor test() {
if (db != null) {
return db.rawQuery("Select * from myTable", new String[]{});
} else {
System.out.println("Db is null :-(");
}
return null;
}
private String[] emtpyArgument = new String[]{};
@Before
public void setup() {
System.out.println("Setting up");
context = new MockContext();
SQLiteOpenHelper dummy = new SQLiteOpenHelper(context, "SomeName.memory", null, 1) {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onCreate(SQLiteDatabase db) {
}
};
String basicInitQuery = "CREATE TABLE IF NOT EXISTS myTable(id INTEGER PRIMARY KEY DESC, value TEXT)";
String basicInsertQuery = "INSERT INTO myTable(id, value) VALUES (1,?)";
db = dummy.getWritableDatabase();
}
@Test
public void baseDbTest() {
Cursor c = test();
if (c != null) {
System.out.println(c.getColumnNames());
System.out.println(c.getColumnCount());
System.out.println("Starting test");
}
}
}
我在 Stackoverflow 上查看了几种不同的解决方案,但似乎没有一个能够为我指出正确的解决方案。它们在此处列出
getWritableDatabase returns null
Android Sqlite always null even after calling getWritableDatabase()
Create SQLite database in android
SQLite getReadableDatabase() returns NULL
SQLiteOpenHelper failing to call onCreate?
我做错了什么,我得到一个空数据库,但没有任何类型的错误或异常?
【问题讨论】:
-
确认一下,这是在
/androidTest中定义的连接测试吗? -
连接测试是什么意思?它目前位于我结构中的指定测试文件夹中。
-
src/-src/test下有两个测试文件夹,其中包含 run on your local machine 的 JUnit 测试和运行单元测试 on a connected Android device 的src/androidTest。您不能在src/test文件夹中使用特定于 Android 的类(在您的情况下为Cursor、Context和SQLiteOpenHelper)。我怀疑这就是你得到null作为回报的原因。 -
它应该能够在本地运行这些测试。如果不用于本地测试,mockContext 有什么用?
-
但是你的整个测试都依赖于
SQLiteOpenHelper,不是吗?