次のような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);
}
});
}
}
これにより、データベースの各エントリが問題なくログに記録されるため、データの書き込みと読み取りが正常に行われたことがわかります。
テスト スイート コードの何が問題なのか、誰にもわかりますか? 今後このプロジェクトのテストケースを書きたいのですが、これがわからなければできません...