知ってから結構経ってしまったけど、ようやく仕事で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 件のコメント:
コメントを投稿