2012年2月10日金曜日

RenamingDelegatingContextを使ってみた

昨年(2011年)の8月に開催されたAndroidテスト祭りで@ussy00さんの発表を聞いてRenamingDelegatingContextの存在を
知ってから結構経ってしまったけど、ようやく仕事でDBを使う機会が出来たので使ってみた。

なにが出来るの?


RenamingDelegatingContextを使うことでテスト用のプレフィックスのついたSQLiteファイルが用意され、
毎回クリーンなデータベース環境が手に入る。

使ってみる


一応テスト対象のクラス等も紹介しておく。

Employee.java(DTO的な何か。必要に応じてシリアライズ可能に。)
※ ゲッター/セッター、import省略
  1. public class Employee {  
  2.   
  3.     public static class EmployeeColumns {  
  4.   
  5.         public static final String ID = "_id"// 社員ID  
  6.   
  7.         public static final String NAME = "name"// 社員名  
  8.   
  9.         public static final String DEPARTMENT = "department"// 部署  
  10.     }  
  11.   
  12.     public static final String TABLE_NAME = "employee";  
  13.   
  14.     private int id;  
  15.     private String name;  
  16.     private String department;  
  17. }  

テーブル構成も簡単にしてみた。
DatabaseHelper.java(ヘルパー)
※ import省略
  1. public class DatabaseHelper extends SQLiteOpenHelper {  
  2.   
  3.     private static final String DATABASE_NAME = "company.db";  
  4.     private static final int DATABASE_VERSION = 1;  
  5.   
  6.     public DatabaseHelper(Context context) {  
  7.         super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  8.     }  
  9.   
  10.     @Override  
  11.     public void onCreate(SQLiteDatabase db) {  
  12.         db.execSQL("CREATE TABLE " + Employee.TABLE_NAME + "(" +  
  13.                 Employee.EmployeeColumns.ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +  
  14.                 Employee.EmployeeColumns.NAME + " TEXT NOT NULL," +  
  15.                 Employee.EmployeeColumns.DEPARTMENT + " TEXT NOT NULL" +  
  16.                 ")");  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  21.     }  
  22. }  

EmployeeDao.java(データベースアクセスクラス。今回のテスト対象クラス。)
※ import省略
  1. public class EmployeeDao {  
  2.   
  3.     private DatabaseHelper mHelper;  
  4.   
  5.     public EmployeeDao(Context context) {  
  6.         mHelper = new DatabaseHelper(context);  
  7.     }  
  8.   
  9.     /** 
  10.      * 部署を条件に社員一覧を取得する。 
  11.      * 順不同 
  12.      * @param department 
  13.      * @return 社員一覧 0件の場合は空のリスト 
  14.      */  
  15.     public List<Employee> getEmployeeByDepartment(String department) {  
  16.         List<Employee> employees = new ArrayList<Employee>();  
  17.         SQLiteDatabase db = mHelper.getReadableDatabase();  
  18.   
  19.         try {  
  20.             Cursor c = db.query(Employee.TABLE_NAME,  
  21.                     new String[]{ EmployeeColumns.ID,  
  22.                             EmployeeColumns.NAME,  
  23.                             EmployeeColumns.DEPARTMENT },  
  24.                     EmployeeColumns.DEPARTMENT + " = ?",  
  25.                     new String[]{ department }, nullnullnull);  
  26.             c.moveToFirst();  
  27.             while (!c.isAfterLast()) {  
  28.                 Employee employee = new Employee();  
  29.                 employee.setId(c.getInt(c.getColumnIndex(EmployeeColumns.ID)));  
  30.                 employee.setName(c.getString(c.getColumnIndex(EmployeeColumns.NAME)));  
  31.                 employee.setDepartment(c.getString(c.getColumnIndex(EmployeeColumns.DEPARTMENT)));  
  32.                 employees.add(employee);  
  33.                 c.moveToNext();  
  34.             }  
  35.             c.close();  
  36.         } finally {  
  37.             db.close();  
  38.         }  
  39.         return employees;  
  40.     }  
  41. }  

そして今回のポイントとなるテストクラス。
EmployeeDaoTest.java
※ import省略
  1. public class EmployeeDaoTest extends AndroidTestCase {  
  2.   
  3.     private static final String TEST_PREFIX = "test_";  
  4.     private DatabaseHelper mHelper;  
  5.     private RenamingDelegatingContext mContext;  
  6.   
  7.     @Override  
  8.     protected void setUp() throws Exception {  
  9.         super.setUp();  
  10.         mContext = new RenamingDelegatingContext(getContext(), TEST_PREFIX);  
  11.         // テストメソッド毎に空のテスト用DBを用意  
  12.         mHelper = new DatabaseHelper(mContext);  
  13.     }  
  14.   
  15.     @Override  
  16.     protected void tearDown() throws Exception {  
  17.         super.tearDown();  
  18.         mHelper.close();  
  19.     }  
  20.   
  21.     /** 
  22.      * getEmployeeByDepartmentのテスト 
  23.      */  
  24.     public void testGetEmployeeByDepartment() {  
  25.         // RenamingDelegatingContextを渡してテスト用DBを使用する  
  26.         EmployeeDao dao = new EmployeeDao(mContext);  
  27.         List<Employee> employees = dao.getEmployeeByDepartment("人事部");  
  28.         assertNotNull(employees);  
  29.         // これ以降のテストは省略  
  30.     }  
  31. }  

ソースを見ればわかると思うけど手順は簡単で
  • Context と文字列を渡してRenamingDelegatingContextを生成
  • 生成したRenamingDelegatingContextを渡してヘルパーを生成
以上。

これを実行すると。。。
テスト用のDBがちゃんとあるね。

0 件のコメント:

コメントを投稿