gpt4 book ai didi

java - 如何 stub /模拟 JDBC ResultSet 以与 Java 5 和 6 一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:23 24 4
gpt4 key购买 nike

我正在测试一些使用 JDBC 语句等的类,现在我遇到了 JDBC ResultSet 接口(interface)的问题:

该软件应同时运行 Java 5 和 Java 6,因此测试也应同时运行这两个版本。不幸的是,Java 6 引入了一堆返回一堆新类/接口(interface)的新方法(这仍然不是什么大问题),这让事情变得更加困难。 (例如参见 Frank Carver’s Punch Barrel - Java 6 breaks JDBC)

在找出这些版本差异之前,我在 stub 和模拟之间进行了考虑,最终选择了 stub ,因为 ResultSet 具有内部状态(处理的当前行),这对我来说使用 stub 更自然,如:

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(例如)回调来让状态反射(reflect)在返回值中,但是有人有其他的——也许更好的——想法吗?

最佳答案

好吧,经过一番思考,我最终得到了 stub 类并用 Mockito 模拟它。作为:

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...
}

(StubResultSetContents 中的 stub 类)。如果有人有其他想法,请随时回答 =)

关于java - 如何 stub /模拟 JDBC ResultSet 以与 Java 5 和 6 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com