まずは・・・

DAOの充実をちゃっちゃとやってしまいましょう
とりあえずupdate、getAll、deleteをやりましょう。
やるといってもインターフェースをいじってテストケースを書けばいいからラクラク〜♪
というわけで変更後のインターフェースはこんな感じ。

public interface BelongToDao {

  public Class BEAN = BelongToEntity.class;

  public int insert(BelongToEntity belongToEntity);

  public BelongToEntity getBelongToEntity(int belongToCode);

  public static final String getBelongToEntity_ARGS = "BELONGTOCODE";

  public int update(BelongToEntity belongToEntity);

  public int delete(BelongToEntity belongToEntity);

  //public int deleteByCode(int belongToCode);

  //public static final String deleteByCode_ARGS = "BELONGTOCODE";

  public List getAllEntity();
}

んでそれに対するテストを書きまくる。
ところが、deleteByCodeのテストを書いて実行したらこう言われた。

  • [EDAO0006](public abstract int redrisefirm.seasar.s2dao.dao.BelongToDao.deleteByCode(int))は不正です。引数は1つでBeanの型と一致しなければなりません。

つまりこれを実装したければ指定したSQLを発行する用に記述する必要があるということらしい。
ということでインターフェースからdeleteByCodeとdeleteByCode_ARGSをコメントアウトする。
んでテストクラスは↓こんな感じ(前日に書いた分は省略)

public class BelongToDaoTest extends S2TestCase {

  private BelongToDao belongToDao = null;

  protected void setUp() throws Exception {
    //DAOのダイコンファイルを読み込んでおく
    include("redrisefirm/seasar/s2dao/dao.dicon");
    //DAOを取得する
    belongToDao = (BelongToDao) getComponent(BelongToDao.class);
  }

  private void setInitialData() {
    //初期データを読み込む
    readXlsReplaceDb("redrisefirm/seasar/s2dao/util/getBelongToResult.xls");
  }

・・・中略(前日分)・・・(本日追加分ここから)

  public final void testInsertDoubleTx() {
    //初期データを読み込む
    setInitialData();
    //insert用のentityを作成
    BelongToEntity belongToEntity = new BelongToEntity();
    belongToEntity.setBelongToCode(1);
    belongToEntity.setBelongToName("デラーズフリート");
    try {
      //実行
      belongToDao.insert(belongToEntity);
    } catch (SQLRuntimeException e) {
      //ここにくるのが正しい
    } catch (Throwable e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }

  public final void testUpdateTx() {
    //初期データを読み込む
    setInitialData();
    //update用のentityを作成
    BelongToEntity updateEntity = new BelongToEntity();
    updateEntity.setBelongToCode(1);
    updateEntity.setBelongToName("ティターンズ");
    //実行
    belongToDao.update(updateEntity);
    //答え合わせ
    BelongToEntity answerEntity = belongToDao.getBelongToEntity(1);
    assertEquals("更新されてません", updateEntity, answerEntity);
  }

  public final void testUpdateEffectRangeTx() {
    //初期データを読み込む
    setInitialData();
    //update用のentityを作成
    BelongToEntity updateEntity = new BelongToEntity();
    updateEntity.setBelongToCode(1);
    updateEntity.setBelongToName("ティターンズ");
    //実行
    belongToDao.update(updateEntity);
    //答え合わせ
    BelongToEntity answerEntity = belongToDao.getBelongToEntity(2);
    assertEquals("値が違います", 2, answerEntity.getBelongToCode());
    assertEquals("値が違います", "ジオン公国", answerEntity.getBelongToName());
  }

  public final void testUpdateOutNumberTx() {
    //初期データを読み込む
    setInitialData();
    //update用のentityを作成
    BelongToEntity updateEntity = new BelongToEntity();
    updateEntity.setBelongToCode(99);
    updateEntity.setBelongToName("ティターンズ");
    try {
      //実行
      belongToDao.update(updateEntity);
    } catch (NotSingleRowUpdatedRuntimeException e) {
      //ここにくるのが正しい
    } catch (Throwable e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }

  public final void testDeleteTx() {
    //初期データを読み込む
    setInitialData();
    //delete用のentityを取得
    BelongToEntity deleteEntity = belongToDao.getBelongToEntity(2);
    //実行
    belongToDao.delete(deleteEntity);
    //取れなければOK
    BelongToEntity confirmEntity = belongToDao.getBelongToEntity(2);
    assertNull(confirmEntity);
    //こっちは取れればOK
    BelongToEntity existEntity = belongToDao.getBelongToEntity(1);
    assertTrue(existEntity instanceof BelongToEntity);
  }

  public final void testGetAllEntityTx() {
    //初期データを読み込む
    setInitialData();
    //全件取得
    List belongToList = belongToDao.getAllEntity();
    //答え合わせ
    assertEquals("リストのサイズが一致しません", 2, belongToList.size());
    BelongToEntity answerEntity1 = (BelongToEntity) belongToList.get(0);
    assertEquals("値が一致しません", 1, answerEntity1.getBelongToCode());
    assertEquals("値が一致しません", "地球連邦", answerEntity1.getBelongToName());
    BelongToEntity answerEntity2 = (BelongToEntity) belongToList.get(1);
    assertEquals("値が一致しません", 2, answerEntity2.getBelongToCode());
    assertEquals("値が一致しません", "ジオン公国", answerEntity2.getBelongToName());
  }
}

ただし、最後のテスト(testGetAllEntityTx())にはちょっとだけ問題が存在する。(と思う)
取得されたリストの順番が保証されていないのだ。
よってorder byで順番を固定するのが正しいと思われる。それについては次のトピックにしよう。