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