用于模拟的可编程 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 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

简述jdbc编程步骤

Java连载130-JDBC编程初步

4.JDBC编程

java JDBC编程流程步骤

JDBC

Java解惑 之 MySQL与JDBC编程