2

与 Finatra 合作并尝试模拟数据库调用以进行测试。我正在使用finagle-postgreswhich 定义此方法:

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 的新手,我还没有找到一个模拟带有函数参数的函数的例子。关于我的模拟是如何错误的任何想法?

4

2 回答 2

0

如果您想要该方法的简单存根,那么您可以执行类似的操作

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

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

于 2018-07-23T17:28:33.533 回答
-2

我会说在 scala 中使用任何“模拟”框架都是一个危险信号。理想情况下,您应该能够通过提供自己的客户端实现来“模拟”。

class MockMysqlClient extends Client {
...
}

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

于 2018-06-15T17:37:16.390 回答