使用JUnit测试写作和阅读中的SQLite [英] Using Junit to test writing and reading to SQLite

查看:259
本文介绍了使用JUnit测试写作和阅读中的SQLite的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个dbManager如下:

I have a dbManager as follows:

//TABLE_AUTH Column names
    public static final String AUTH_CODE = "AuthCode";
    public static final String SESSION_ID = "SessionId";
    public static final String AUTH_TIME = "LastAuthorized";
    public static final String ENCRYPT_KEY = "EncryptKey";    

//TABLE_AUTH Create Statement
    public static final String CREATE_AUTH_TABLE = "CREATE TABLE "
            + TABLE_AUTH + "("
            + AUTH_CODE + " TEXT, "
            + SESSION_ID + " TEXT, "
            + AUTH_TIME + " DATETIME, "
            + ENCRYPT_KEY
            +" TEXT" +")";

public DBManager(Context ctx) {
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
   db.execSQL(CREATE_AUTH_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_AUTH);
    onCreate(db);
}

public static DBManager getInstance(Context ctx){
    if(instance==null){
        instance = new DBManager(ctx);
    }
    return instance;
}

我想测试的写作和阅读到此DB与Android的测试案例,所以我开发的是如下:

I wanted to test the writing and reading to this db with android test cases so I developed it is follows:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.InstrumentationTestCase;
import android.util.Log;

import com.etlie.stockclient.DBManager.DBManager;

public class SQLiteTest extends InstrumentationTestCase {

    DBManager databaseManager;
    SQLiteDatabase dbWrite;
    SQLiteDatabase dbRead;

    ContentValues contentValues;

    protected void setUp() throws Exception{
        super.setUp();

        databaseManager = DBManager.getInstance(getInstrumentation().getContext());

        //TABLE AUTH TEST
        dbWrite = databaseManager.getWritableDatabase();
        dbRead = databaseManager.getReadableDatabase();
        contentValues = new ContentValues();
    }

    public void testReadWriteAuthTable() throws Exception{

        contentValues.put(databaseManager.AUTH_CODE, "auth code");
        contentValues.put(databaseManager.SESSION_ID, "session id");
        contentValues.put(databaseManager.AUTH_TIME, System.currentTimeMillis());
        contentValues.put(databaseManager.ENCRYPT_KEY, "encrypt key");

        dbWrite.insert(databaseManager.TABLE_AUTH, null, contentValues);

        String selectQuery = "SELECT * FROM " + databaseManager.TABLE_AUTH;

        Log.i(databaseManager.LOG_TAG, selectQuery);

        Cursor c = dbRead.rawQuery(selectQuery, null);

        if(c!=null)
            c.moveToFirst();

        String authCode = c.getString(c.getColumnIndex(databaseManager.AUTH_CODE));
        String sessionId = c.getString(c.getColumnIndex(databaseManager.SESSION_ID));
        String encryptKey = c.getString(c.getColumnIndex(databaseManager.ENCRYPT_KEY));

        Log.i("AUTH CODE: ", authCode);
        Log.i("SESSION ID: ", sessionId);
        Log.i("ENCRYPT KEY: ", encryptKey);

        assertEquals(authCode, "auth code");
        assertEquals(sessionId, "session id");
        assertEquals(encryptKey, "encrypt key");
    }
}

然而,当我跑的测试套件坠毁在那里我试图初始化dbWrite

However, when I ran the test suite it crashed where I tried to initialise the dbWrite

dbWrite = databaseManager.getWritableDatabase();

和我得到的错误错误code = 14,无法打开数据库。我原以为这是什么毛病我的数据库创建code等。

and I got the error "error code = 14, unable to open db". I had thought that it was something wrong with my db create code etc.

我然后以不同的方式通过创建测试活性试验:

I then tested in a different way by creating a test activity:

public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity_layout);

        Button button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DBManager dbManager = DBManager.getInstance(getApplicationContext());
                SQLiteDatabase sqLiteDatabase = dbManager.getWritableDatabase();
                SQLiteDatabase sqLiteDatabase1 = dbManager.getReadableDatabase();

                ContentValues contentValues = new ContentValues();
                contentValues.put(dbManager.AUTH_CODE, "auth code");
                contentValues.put(dbManager.SESSION_ID, "session id");
                contentValues.put(dbManager.AUTH_TIME, System.currentTimeMillis());
                contentValues.put(dbManager.ENCRYPT_KEY, "encrypt key");

                sqLiteDatabase.insert(dbManager.TABLE_AUTH, null, contentValues);


                String selectQuery = "SELECT * FROM " + dbManager.TABLE_AUTH;
                Cursor c = sqLiteDatabase1.rawQuery(selectQuery, null);
                if(c!=null)
                    c.moveToFirst();

                String authCode = c.getString(c.getColumnIndex(dbManager.AUTH_CODE));
                String sessionId = c.getString(c.getColumnIndex(dbManager.SESSION_ID));
                String encryptKey = c.getString(c.getColumnIndex(dbManager.ENCRYPT_KEY));

                Log.i("AUTH CODE: ", authCode);
                Log.i("SESSION ID: ", sessionId);
                Log.i("ENCRYPT KEY: ", encryptKey);
            }
        });   
    }
}

本记录在数据库中的每个条目没有问题,所以我知道,数据写入和读取成功。

This logged each entry in the db no problem so I know that data was written and read successfully.

有人能看到什么可能是错误的测试套件,code?我想编写测试用例为这个项目向前发展,如果我不能算出这个我不能这样做...

Can anyone see what might be wrong with the test suite code? I want to write test cases for this project going forward and if I can't figure this out I can't do so...

推荐答案

在创建的DatabaseManager你需要传递

When creating your databaseManager you need to pass in

getInstrumentation().getTargetContext()

而不是

getInstrumentation().getContext()

请参阅的http://developer.android.com/reference/android/app/Instrumentation.html#getTargetContext()为详细原因。基本上getTargetContext()返回自己的应用程序上下文。

See http://developer.android.com/reference/android/app/Instrumentation.html#getTargetContext() for the detailed reasons. Basically getTargetContext() returns a Context for your own application.

这篇关于使用JUnit测试写作和阅读中的SQLite的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆