使用Mockito模拟具有功能参数的scala方法

时间:2016-02-04 01:29:43

标签: postgresql scala unit-testing mockito finagle

使用Finatra并尝试模拟数据库调用以进行测试。我正在使用定义此方法的finagle-postgres

def prepareAndQuery[T](sql: String, params: Any*)(f: Row => T): Future[Seq[T]] = {...}

使用Mockito的其他模拟很简单。但是,我似乎无法让这个工作。在与编译器挣扎之后,我终于找到了这个,但它在运行时不起作用:

case class Foo( a: Int, b: Int, c: Int )
val client = smartMock[Client]
def f(row:Row): Foo = {
  Foo(1,2,3)
}
client.prepareAndQuery[Foo]("select 1") returns { x => f(x) }

执行测试抛出:

org.mockito.exceptions.verification.SmartNullPointerException: 
...
because this method call was *not* stubbed correctly:

我是Mockito的新手,我还没有找到一个模拟带函数参数的函数的例子。关于我的模拟是如何错误的任何想法?

2 个答案:

答案 0 :(得分:0)

我想说使用任何“模拟”框架都是scala中的红旗。 理想情况下,您应该通过提供自己的客户端实现来“模拟”。

class MockMysqlClient extends Client {
...
}

只需覆盖/实现应该从DB返回值的方法。

答案 1 :(得分:0)

如果您想要该方法的直接存根,则可以执行类似的操作

val client = mock[Client]
when(client.prepareAndQuery[Foo](any, any)(any)) thenReturn Future.successful(<whatever you want>)

无论如何都会返回<whatever you want>