かなり雑な作りです。こんなのも作ったんだという覚書として上げます。
使う場合は実際の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();
}
}
}