Java Mockito监视HSQLDB连接

Java Mockito监视HSQLDB连接,java,unit-testing,mockito,hsqldb,Java,Unit Testing,Mockito,Hsqldb,我正在为一些使用HSQLDB从中获取数据的代码编写测试用例。但是,内存数据库中不支持my DAO调用的某个查询/函数 当这个特定的查询被触发时,我试图返回一个自定义的ResultSet,否则将默认为正常行为(从内存数据库中获取) 相关代码: db = new EmbeddedDatabaseBuilder().addScript("resources/create-test-db.sql") .addScript("resources/add-test-data.sql").build(

我正在为一些使用HSQLDB从中获取数据的代码编写测试用例。但是,内存数据库中不支持my DAO调用的某个查询/函数

当这个特定的查询被触发时,我试图返回一个自定义的
ResultSet
,否则将默认为正常行为(从内存数据库中获取)

相关代码:

db = new EmbeddedDatabaseBuilder().addScript("resources/create-test-db.sql")
    .addScript("resources/add-test-data.sql").build();
Connection conn = Mockito.spy(db.getConnection());

PreparedStatement mockPreparedStatement = Mockito.mock(PreparedStatement.class); 
when(conn.prepareStatement(query)).thenReturn(mockPreparedStatement);
我将
conn
传递给我的对象。然而,似乎HSQL实际上正在尝试运行查询,因此,我得到了一个错误

我该怎么做呢?

你需要在模仿间谍时使用

doReturn(mockPreparedStatement).when(conn).prepareStatement(query);
你需要在嘲弄间谍时使用

doReturn(mockPreparedStatement).when(conn).prepareStatement(query);
重要的是,我已经掌握了监视真实物体的方法

有时,用when(Object)来对付间谍是不可能或不切实际的。 因此,在使用间谍时,请考虑DeleTurn回答“Sun())的方法。 例如:

List list = new LinkedList();
List spy = spy(list);
//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
资料来源:

因此,在您的情况下,请尝试以下方法:

doReturn(mockPreparedStatement).when(conn).prepareStatement(query);
重要的是,我已经掌握了监视真实物体的方法

有时,用when(Object)来对付间谍是不可能或不切实际的。 因此,在使用间谍时,请考虑DeleTurn回答“Sun())的方法。 例如:

List list = new LinkedList();
List spy = spy(list);
//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
资料来源:

因此,在您的情况下,请尝试以下方法:

doReturn(mockPreparedStatement).when(conn).prepareStatement(query);

您可以将此查询提取到一个方法中并模拟该方法。您正在测试什么?如果您正在测试DAO,那么模拟连接、准备好的语句和结果集不会测试任何代码。如果您使用DAO测试一个服务,那么您应该模拟DAO,而不是连接。当前的实现使得传递模拟DAO不是一个选项。因此,我的方法您可以将此查询提取到一个方法中并模拟该方法。您正在测试什么?如果您正在测试DAO,那么模拟连接、准备好的语句和结果集不会测试任何代码。如果您使用DAO测试一个服务,那么您应该模拟DAO,而不是连接。当前的实现使得传递模拟DAO不是一个选项。因此,我的方法