用于模拟的可编程 JDBC 驱动程序
Posted
技术标签:
【中文标题】用于模拟的可编程 JDBC 驱动程序【英文标题】:Programmable JDBC driver for mocking 【发布时间】:2011-05-08 20:28:24 【问题描述】:我正在尝试测试旧版 Java 应用程序,但目前无法重构其代码。我需要做的就是了解它通过 JDBC 发送什么 SQL 请求以及何时发送。我想将所有这些请求协议为纯文本文件以供将来查看。
我需要开发一个自定义的 JDBC 驱动程序,它可以欺骗应用程序,并且表现得像一个普通的驱动程序(将接受请求,返回一些值,在某些情况下失败 , ETC)。像往常一样的模拟结构......
问题是 - 你知道这个任务的任何现有框架吗?理想情况下,我希望能够通过 XML 文件配置我的驱动程序的行为。
【问题讨论】:
JDBC mocking 工具有什么更新吗? 【参考方案1】:p6spy 包装一个现有的 jdbc 连接,并允许您例如看看来回发生了什么。
有关说明,请参阅 http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/。
【讨论】:
感谢链接,看起来很有趣。然而,这并不是我想要的。 P6spy 是一个工具来协议正在发生的事情,而不是改变 JDBC 驱动程序的行为。【参考方案2】:如果你想做单元测试,而不是集成测试,那么 您可以使用非常基本且简单的方法,仅使用 Mockito,如下所示:
public class JDBCLowLevelTest
private TestedClass tested;
private Connection connection;
private static Driver driver;
@BeforeClass
public static void setUpClass() throws Exception
// (Optional) Print DriverManager logs to system out
DriverManager.setLogWriter(new PrintWriter((System.out)));
// (Optional) Sometimes you need to get rid of a driver (e.g JDBC-ODBC Bridge)
Driver configuredDriver = DriverManager.getDriver("jdbc:odbc:url");
System.out.println("De-registering the configured driver: " + configuredDriver);
DriverManager.deregisterDriver(configuredDriver);
// Register the mocked driver
driver = mock(Driver.class);
System.out.println("Registering the mock driver: " + driver);
DriverManager.registerDriver(driver);
@AfterClass
public static void tearDown() throws Exception
// Let's cleanup the global state
System.out.println("De-registering the mock driver: " + driver);
DriverManager.deregisterDriver(driver);
@Before
public void setUp() throws Exception
// given
tested = new TestedClass();
connection = mock(Connection.class);
given(driver.acceptsURL(anyString())).willReturn(true);
given(driver.connect(anyString(), Matchers.<Properties>any()))
.willReturn(connection);
given(connection.prepareCall(anyString())).willReturn(statement);
您可以测试各种场景,就像在任何其他 Mockito 测试中一样,例如
@Test
public void shouldHandleDoubleException() throws Exception
// given
SomeData someData = new SomeData();
given(connection.prepareCall(anyString()))
.willThrow(new SQLException("Prepare call"));
willThrow(new SQLException("Close exception")).given(connection).close();
// when
SomeResponse response = testClass.someMethod(someData);
// then
assertThat(response, is(SOME_ERROR));
【讨论】:
以上是关于用于模拟的可编程 JDBC 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章