知ってから結構経ってしまったけど、ようやく仕事でDBを使う機会が出来たので使ってみた。
なにが出来るの?
RenamingDelegatingContextを使うことでテスト用のプレフィックスのついたSQLiteファイルが用意され、
毎回クリーンなデータベース環境が手に入る。
使ってみる
一応テスト対象のクラス等も紹介しておく。
Employee.java(DTO的な何か。必要に応じてシリアライズ可能に。)
※ ゲッター/セッター、import省略
- public class Employee {
- public static class EmployeeColumns {
- public static final String ID = "_id"; // 社員ID
- public static final String NAME = "name"; // 社員名
- public static final String DEPARTMENT = "department"; // 部署
- }
- public static final String TABLE_NAME = "employee";
- private int id;
- private String name;
- private String department;
- }
テーブル構成も簡単にしてみた。
DatabaseHelper.java(ヘルパー)
※ import省略
- public class DatabaseHelper extends SQLiteOpenHelper {
- private static final String DATABASE_NAME = "company.db";
- private static final int DATABASE_VERSION = 1;
- public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("CREATE TABLE " + Employee.TABLE_NAME + "(" +
- Employee.EmployeeColumns.ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- Employee.EmployeeColumns.NAME + " TEXT NOT NULL," +
- Employee.EmployeeColumns.DEPARTMENT + " TEXT NOT NULL" +
- ")");
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- }
- }
EmployeeDao.java(データベースアクセスクラス。今回のテスト対象クラス。)
※ import省略
- public class EmployeeDao {
- private DatabaseHelper mHelper;
- public EmployeeDao(Context context) {
- mHelper = new DatabaseHelper(context);
- }
- /**
- * 部署を条件に社員一覧を取得する。
- * 順不同
- * @param department
- * @return 社員一覧 0件の場合は空のリスト
- */
- public List<Employee> getEmployeeByDepartment(String department) {
- List<Employee> employees = new ArrayList<Employee>();
- SQLiteDatabase db = mHelper.getReadableDatabase();
- try {
- Cursor c = db.query(Employee.TABLE_NAME,
- new String[]{ EmployeeColumns.ID,
- EmployeeColumns.NAME,
- EmployeeColumns.DEPARTMENT },
- EmployeeColumns.DEPARTMENT + " = ?",
- new String[]{ department }, null, null, null);
- c.moveToFirst();
- while (!c.isAfterLast()) {
- Employee employee = new Employee();
- employee.setId(c.getInt(c.getColumnIndex(EmployeeColumns.ID)));
- employee.setName(c.getString(c.getColumnIndex(EmployeeColumns.NAME)));
- employee.setDepartment(c.getString(c.getColumnIndex(EmployeeColumns.DEPARTMENT)));
- employees.add(employee);
- c.moveToNext();
- }
- c.close();
- } finally {
- db.close();
- }
- return employees;
- }
- }
そして今回のポイントとなるテストクラス。
EmployeeDaoTest.java
※ import省略
- public class EmployeeDaoTest extends AndroidTestCase {
- private static final String TEST_PREFIX = "test_";
- private DatabaseHelper mHelper;
- private RenamingDelegatingContext mContext;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mContext = new RenamingDelegatingContext(getContext(), TEST_PREFIX);
- // テストメソッド毎に空のテスト用DBを用意
- mHelper = new DatabaseHelper(mContext);
- }
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mHelper.close();
- }
- /**
- * getEmployeeByDepartmentのテスト
- */
- public void testGetEmployeeByDepartment() {
- // RenamingDelegatingContextを渡してテスト用DBを使用する
- EmployeeDao dao = new EmployeeDao(mContext);
- List<Employee> employees = dao.getEmployeeByDepartment("人事部");
- assertNotNull(employees);
- // これ以降のテストは省略
- }
- }
ソースを見ればわかると思うけど手順は簡単で
- Context と文字列を渡してRenamingDelegatingContextを生成
- 生成したRenamingDelegatingContextを渡してヘルパーを生成
これを実行すると。。。
テスト用のDBがちゃんとあるね。
0 件のコメント:
コメントを投稿