JDBCステートメントなどを使用して動作するクラスの一部をテストしていますが、JDBCResultSetインターフェイスで問題が発生しました。
ソフトウェアはJava5とJava6の両方で実行する必要があるため、テストも両方のバージョンで実行する必要があります。残念ながら、Java 6は、一連の新しいクラス/インターフェースを返す一連の新しいメソッド(まだ大したことではありません)を導入しました。これにより、事態はさらに困難になります。(FrankCarverのPunchBarrelを参照してください-たとえば、Java 6はJDBCを壊します)
これらのバージョンの違いを見つける前に、スタブとモックのどちらかを検討しましたが、ResultSetにはスタブを操作するのがより自然な内部状態(現在の行が処理される)があるため、スタブになりました。
public class StubResultSet implements ResultSet {
private Object[][] data;
private int currentRow = -1;
private boolean closed = false;
public StubResultSet(Object[][] data) {
this.data = data;
}
public Object getObject(int columnIndex) throws SQLException {
checkClosed();
return data[currentRow][columnIndex];
}
public String getString(int columnIndex) throws SQLException {
checkClosed();
return (String) getObject(columnIndex);
}
// ...
}
しかし、新しいメソッドをとして導入しないpublic NClob getNClob(int columnIndex)
と、クラスはJava 6で壊れます。クラスを導入すると、Java5で壊れます。
mockito(たとえば)コールバックを使用して、状態が戻り値に反映されるようにすることはできますが、他の誰か(おそらくもっといいアイデア)がありますか?