1

次のようなdbManagerがあります。

//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;
}

このデータベースへの書き込みと読み取りを Android テストケースでテストしたかったので、次のように開発しました。

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 を初期化しようとしたところでクラッシュしました。

dbWrite = databaseManager.getWritableDatabase();

「エラーコード= 14、dbを開けません」というエラーが表示されました。私は自分のデータベース作成コードなどに何か問題があると思っていました.

次に、テスト アクティビティを作成して別の方法でテストしました。

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);
            }
        });   
    }
}

これにより、データベースの各エントリが問題なくログに記録されるため、データの書き込みと読み取りが正常に行われたことがわかります。

テスト スイート コードの何が問題なのか、誰にもわかりますか? 今後このプロジェクトのテストケースを書きたいのですが、これがわからなければできません...

4

1 に答える 1

2

databaseManager を作成するときは、渡す必要があります

getInstrumentation().getTargetContext()

それ以外の

getInstrumentation().getContext()

詳細な理由については、http://developer.android.com/reference/android/app/Instrumentation.html#getTargetContext()を参照してください。基本的に getTargetContext() は、独自のアプリケーションの Context を返します。

于 2014-10-22T16:22:09.327 に答える