| 著作一覧 |
青木さんのtDiary / コメント SPAM 避けチェックボックスパッチを入れてみる。
ところでfumihiroさんの指摘が直ってないよ。と思ったら、20050123という日付だな。
以前超訳したフリーマンのモックオブジェクトを利用したテストファーストについて。
ただ、僕自身はJDBCそのものをモックするよりは、それがどんな実装であれDAOに類するコンポーネントに実際のDBマネージャとのインターフェイスを任せるようにビジネスロジックを実装し、そのDAOのモックを使うほうがいいんじゃないかと最近は考えています。っていうか、たとえばモックのResultSetを使うとgetStringなんかの呼び出しを延々と記述することになるため、あまりにも辛い。
それとは別にモックDBみたいなものを用意する(JDBC部分のユニットテストは捨てて、単にテストデータを供給するだけの仕組み)のも良さそうです。
つまり、テストプログラム→テスト対象→モック(DAO)とするか、テストプログラム→テスト対象→データ供給モック とするということです。
で、ENDOはテスト対象の内部の複数のクラスのインタラクションなんかに適用してみる(DAOモックは当然、ENDOできるのでそれはそれであり)。
Win32系だと、テスト対象→ADO→OLEDB→Excelというように、ADOに与える接続文字列の変更でDB(この場合、データ供給だけに着目)の切り替えができるんだけど。(というのは、JDOを調べるかに絡んでくるんだが)
とは言え、すぐわかったけど。でもわからなければわからんね、やっぱり。
public class Starter {
/** 空のインスタンス */
public Starter() {
}
/** すぐ使えるインスタンス */
public Starter(String s) {
initNew(s);
}
/** 初期化、再初期化時に呼ぶ */
public void initNew(String s) {
}
}
の場合の罠だ。
実装継承でFollowerを作成。
public class Follower extends Starter {
List list = new ArrayList();
public Follower(String s) {
super(s);
}
public void initNew(String s) {
list.add(s); // ドーン
}
}
案1
public class Follower extends Starter {
List list = new ArrayList();
public Follower(String s) {
super();
initNew(s);
}
....
}
良くないがこれでもできる。
public class Follower extends Starter {
List list;
public Follower(String s) {
super(s);
}
public void initNew(String s) {
if (list == null) { // でもこれは見苦しいな。
list = new ArrayList();
}
...
}
}
ちなみに泥沼化の例。
public class Follower extends Starter {
List list = new ArrayList();
public Follower(String s) {
super(s);
}
public void initNew(String s) {
if (list == null) {
list = new ArrayList();
}
list.add(s);
...
}
public void foo() {
if (list.size() == 0) {
System.out.println("WHHHHHHHHHHHHHHHHHHY!!!");
System.exit(1); // maybe, java has a bug pun pun...
}
...
}
}
もちろんJavaは正しい
ジェズイットを見習え |