私はmockitoで単純なDAOレイヤーをテストしていますが、基本的にはインターフェイスをテストするのが難しい問題を発見しました。私はあなたに私にいくつかの洞察力を与えることができるかどうか疑問に思っていました...テスト容易化のためのリファクタリングの必要性
これは私がテストしたい方法です:
public Person getById(UserId id) {
final Person person = new PersonImpl();
gateway.executeQuery(GET_SQL + id.getUserId(), new ResultSetCommand(){
public int work(ResultSet rs) throws SQLException {
if(rs.next()){
person.getName().setGivenName(rs.getString("name"));
person.getName().setFamilyName(rs.getString("last_name"));
}
return 0;
}
});
return person;
}
私はDatabaseGatewayを使用するJavaコードとSQLの間、私のインタフェースであり、その方法は、匿名クラスを受け入れ、これはゲートウェイのメソッドのexecuteQueryです:
public int executeQuery(String sql, ResultSetCommand cmd) {
try{
Connection cn = createConnection();
PreparedStatement st = cn.prepareStatement(sql);
int result = cmd.work(st.executeQuery());
cn.close();
return result;
}catch(Exception e){
throw new RuntimeException("Cannot Create Statement for sql " + sql,e);
}
}
事があるため、その匿名クラスで、PersonDAOをテストするために難しくなってきた、ということです。
私は誰かがよりよい設計を(私はシンプルな1があると確信しているが、私はちょうどそれを見つけるように見えることはできません)をお勧めている場合でも、匿名クラスを削除し、全体のコードをリファクタリングすることができます。提案のため
みんなありがとう。
PD:テスト
public void testGetPersonById(){
DatabaseGateway gateway = mock(DatabaseGateway.class);
when(gateway.executeQuery(anyString(),any(ResultSetCommand.class)));
PersonDAO person_dao = new PersonDAOImpl(gateway);
Person p = person_dao.getById(new UserId(Type.viewer,"100"));
}
参照を行うのは難しいです:あなたは、さらに情報が必要な場合、
EDIT気軽に? ResultCommandはモックの一部です。私はそのコードをテストすることにも興味があります。その特定のコマンドについて別のテストを行うべきですか?
難しくなっているテストの例を挙げてください。 –
Javaはうまくいきませんが、ResultSetCommandは関係ありません。 GetPersonByIdをテストして、有効なUserIdが与えられたときに正しいPersonを返し、無効なPersonIdが与えられたときに例外をスローします。正しく動作する場合は、特定のResultSetCommandを使用しても構いません。 –