2013年12月15日日曜日

Unitテスト用DAO

Spring+ibatis+JUnitを想定したDAOのMockです。
かなり雑な作りです。こんなのも作ったんだという覚書として上げます。
使う場合は実際のDAOの仕様に合わせて改修する必要があります。

MockDao.java
package my.junit.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * DAOに割り込んで任意の結果を返すクラス
 * 実際には本来のDAOと同じインターフェイスをimplementsする。
 * DAOがDIされているシステムを想定。
 * @author blog owner
 */
public class MockDao {

 private static final Log LOG = LogFactory.getLog(MockDao.class);

 /**
  * 任意の結果を保持するマップ
  */
 protected static Map<Object, Object> resultMap = null;

 /**
  * 本来のDAOを想定したクラス
  *
  * @author blog owner
  *
  */
 private static class Dao {
  public Object execute(String sqlId, Object params) {
   return null;
  }
 }

 /**
  * 本来のDAO
  */
 private Dao dao = null;

 /**
  * 任意の結果を追加
  * @param sqlId
  * @param result
  */
 public static void putResult(String sqlId, Object result) {
  resultMap.put(sqlId, result);
 }

 /**
  * 任意の結果を追加
  * @param sqlId
  * @param params
  * @param result
  */
 public static void putResult(String sqlId, Object params, Object result) {
  put(sqlId, params, result);
 }

 /**
  * 任意の結果を追加
  * @param sqlId
  * @param params
  * @param result
  */
 protected static void put(String sqlId, Object params, Object result) {
  List<Object> key = new ArrayList<Object>();
  key.add(sqlId);
  key.add(params);
  resultMap.put(key, result);
 }

 /**
  * 任意の結果を初期化
  * テストメソッド実行時には必ずこれをやる
  */
 public static void initialize() {
  resultMap = new HashMap<Object, Object>();
 }

 /**
  * 任意の結果をクリア
  */
 public static void clearResult() {
  resultMap = null;
 }

 /**
  * 任意の結果の件数を取得
  * @return
  */
 public static int size() {
  if (resultMap == null) {
   return 0;
  } else {
   return resultMap.size();
  }
 }

 /**
  * sqlを実行
  * sqlId+paramまたはsqlIdをキーとして一致する任意の結果がある場合は、その結果を返す
  * 無い場合は本来のDAOでsqlを実行した結果を返す。
  * @param sqlId
  * @param params
  * @return
  * @throws Exception
  */
 public Object execute(String sqlId, Object params) throws Exception {
  try {
   Object result = getResult(sqlId, params);
   if (result instanceof Exception) {
    throw (Exception) result;
   } else {
    return result;
   }
  } catch (NoSuchKeyException e) {
   return dao.execute(sqlId, params);
  }
 }

 /**
  * sqlId+paramまたはsqlIdをキーとして一致する任意の結果がある場合は、その結果を返す
  * 結果がない場合は例外を投げる
  * @param sqlId
  * @param params
  * @return
  * @throws NoSuchKeyException
  */
 protected static Object getResult(String sqlId, Object params)
   throws NoSuchKeyException {
  if(resultMap == null || resultMap.isEmpty()){
   LOG.debug("sqlId=" + sqlId + "でテーブルへアクセスします。");
   throw new NoSuchKeyException();
  }
  List<Object> key = new ArrayList<Object>();
  key.add(sqlId);
  key.add(params);
  if (resultMap.containsKey(key)) {
   LOG.debug("key=" + key + "のダミーの結果を返します。");
   return resultMap.get(key);
  } else if (resultMap.containsKey(sqlId)) {
   LOG.debug("sqlId=" + sqlId + "のダミーの結果を返します。");
   return resultMap.get(sqlId);
  } else {
   LOG.debug("sqlId=" + sqlId + "でテーブルへアクセスします。");
   throw new NoSuchKeyException();
  }
 }
}


0 件のコメント:

コメントを投稿