【问题标题】:Mockito spy on a HSQLDB connectionMockito 监视 HSQLDB 连接
【发布时间】:2016-08-13 05:03:27
【问题描述】:

我正在为一些使用 HSQLDB 从中获取数据的代码编写测试用例。但是,内存数据库不支持我的 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 实际上是在尝试运行查询,因此出现错误。

我应该怎么做?

【问题讨论】:

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

标签: java unit-testing mockito hsqldb


【解决方案1】:

监视真实物体的重要问题!

有时使用 when(Object) 来存根间谍是不可能或不切实际的。 因此,在使用间谍时,请考虑使用 doReturn|Answer|Throw() 系列方法进行存根。

例子:

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);

来源:Mockito Documentation

所以在你的情况下,试试这个:

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

【讨论】:

    【解决方案2】:

    嘲笑间谍时需要使用doReturn()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多