Я тестирую простой слой DAO с помощью mockito, но обнаружил проблему, в основном сложный для тестирования интерфейс, и мне было интересно, не могли бы вы дать мне некоторое представление ...
Это метод, который я хочу проверить:
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 становится все труднее.
Я могу реорганизовать весь код, даже удалить анонимный класс, если кто-то предложит лучший дизайн (я уверен, что есть более простой, но я просто не могу его найти).
Спасибо всем за предложения.
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"));
}
См? ResultCommand является частью макета, и я тоже заинтересован в тестировании этого кода ... я должен сделать отдельный тест для этой конкретной команды?