I\'m testing some of my classes working with JDBC statements etc and now I got problem with JDBC ResultSet interface:
The software should run both with Java 5 and Ja
Well, after some thinking I ended up having the stub class as there and mocking it with Mockito as:
public static ResultSet initMock(Object[][] data) throws SQLException {
final StubResultSetContents contents = new StubResultSetContents(data);
ResultSet rs = mock(ResultSet.class, RETURNS_SMART_NULLS);
when(rs.getObject(anyInt())).thenAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return contents.getObject(getIntArgument(invocation));
}
});
// a bunch of similar when(...).thenAnswer(...) constructs...
}
(stub class in StubResultSetContents). If somebody has some other ideas, feel free to answer =)
I had the same problem and solved it using a Proxy implementation. It seems like it's working pretty good.
public class TestResultSet implements InvocationHandler {
public static ResultSet createProxy(HashMap<Object, Object>[] rows) {
return (ResultSet) Proxy.newProxyInstance(ResultSet.class.getClassLoader(),
new Class[] { ResultSet.class },
new TestResultSet(rows));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// Find the equivalent method in the proxy class.
Method m = TestResultSet.class.getMethod(method.getName(), method.getParameterTypes());
if(m == null) {
throw new SQLException("Unsupported method " + method.getName());
}
return m.invoke(this, args);
}
// Method implementations follow here (only one supplied as an example)
public boolean isFirst() throws SQLException {
return index ==0;
}
}