Я тестирую некоторые из моих классов, работающих с операторами JDBC и т. Д., И теперь у меня возникла проблема с интерфейсом JDBC ResultSet:
Программное обеспечение должно работать как с Java 5, так и с Java 6, и, следовательно, тесты также должны выполняться с обеими версиями. К сожалению, в Java 6 появилось множество новых методов (что пока не так уж важно), которые возвращают кучу новых классов / интерфейсов, что усложняет ситуацию. (см. Штанга Фрэнка Карвера - 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 - если я представлю их класс в сломанном в Java 5.
Я могу работать с обратными вызовами mockito (например), чтобы состояние отражалось с возвращаемыми значениями, но есть ли у кого-нибудь другая, может быть, более приятная идея?