java - 尝试测试 SQLiteOpenHelper 但 getWritableDatabase() 抛出 Null

标签 java android junit sqliteopenhelper

我正在尝试使用我的 SQLiteOpenHelper 对象在 Android Studio 中针对我的应用程序数据库编写一个 junit 测试。每次它遇到插入方法时,我都会得到一个 NullPointerException。我在使用 getContext() 和我设置的 mockContext 之间来回切换但没有骰子。我已经启动并运行了我的模拟器。有人可以告诉我我做错了什么吗?

public class LocationDatabaseHelperTest extends AndroidTestCase {

    private SQLiteDatabase testDB;
    private SQLiteDatabase readDB;
    private LocationDatabaseHelper dbh;
    private RenamingDelegatingContext mockContext;
    private ContentValues cv;



    /**
     *Sets up a mock context to initialize the
     * LocationDatabaseHelper object.
     * @throws Exception
     */
    public void setUp() throws Exception {
        super.setUp();


        final String prefix = "test";
        mockContext = new RenamingDelegatingContext(getContext(),prefix);
        dbh = new LocationDatabaseHelper(mockContext);

        try {
            testDB = dbh.getWritableDatabase();
        } catch(Exception ex){
            ex.printStackTrace();
        }

        readDB = dbh.getReadableDatabase();
        cv = new ContentValues();
    }


    /**
     *Tests that asserts LocationDatabaseHelper object instantiates.
     */
    public void testLocationDatabaseHelper() {
        assertNotNull(dbh);
    }



    public void testInsert() {


        String id = "seattle";
        float heading = (float) 20.178545;
        double longitude = 122.20;
        double lat = 47.37;
        float speed = (float) 65.4587;
        long time = System.currentTimeMillis();
        LocationPackage locations = new LocationPackage(id,heading,longitude, lat,speed, time);


        cv.put(dbh.COLUMN_LOCATION_id, (String) locations.id);
        cv.put(dbh.COLUMN_LOCATION_HEADING, (float) locations.heading);
        cv.put(dbh.COLUMN_LOCATION_lat, (double) locations.latitude);
        cv.put(dbh.COLUMN_LOCATION_SPEED, (float) locations.speed);
        cv.put(dbh.COLUMN_LOCATION_long, (double) locations.longitude);
        cv.put(dbh.COLUMN_LOCATION_TIMESTAMP, (long) locations.time);


         testDB.insert(dbh.TABLE_LOCATION, null, cv);



        String selectQuery = "SELECT * FROM " + dbh.TABLE_LOCATION;
        Log.i(dbh.toString(), selectQuery);
        Cursor c = readDB.rawQuery(selectQuery, null);
        if(c!=null)
            c.moveToFirst();

        String locID = c.getString(c.getColumnIndex(dbh.COLUMN_LOCATION_id));

        //Log.i("LocationID: ", locID);
        assertEquals(locID, "userid");


        //assertTrue(insertID != -1);
    }


    public void tearDown() throws Exception {

        super.tearDown();

        //dbh.clearDatabase();
    }

}

最佳答案

您忘记打开数据库。执行 dbh.open()。之后不要忘记关闭您的数据库。

关于java - 尝试测试 SQLiteOpenHelper 但 getWritableDatabase() 抛出 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553336/

相关文章:

java - 在 gradle 中,如何为单独的任务创建单独的测试报告?

spring - 如何在 JAVA 的 rest API 中将图像返回给浏览器?

java - weblogic - 相互身份验证 - 从 HTTP header 读取证书

java - 使用预签名 URL 使用 curl 上传到 s3(得到 403)

java - 应用程序在设备上运行但在模拟器上崩溃?

java - 如何通过aspect的切入点在java代码中插入方法?

java - 没有 Eclipse 的 JUnit : how to get the TestRunner Window

java - HornetQ Persistence 不删除文件

Android - 如何禁用底部工作表的 STATE_HALF_EXPANDED 状态

java - 莫基托。验证方法参数