Я тестирую простой слой 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: если вам нужна дополнительная информация, не стесняйтесь спросить
EDIT: тест, что трудно сделать
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 является частью макета, и я тоже заинтересован в тестировании этого кода ... должен ли я сделать отдельный тест для этой конкретной команды?
Просьба привести пример теста, который усложняется. –
Я не знаю Java хорошо, но я бы сказал, что ResultSetCommand не имеет значения. Вы тестируете getPersonById, чтобы убедиться, что он возвращает правильного Person, когда ему задан действительный UserId, выдает исключение, когда ему присваивается недопустимое значение, и т. Д. Если он работает правильно, вам все равно, что он использует конкретный ResultSetCommand. –