与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 的新手,我还没有找到模拟采用函数参数的函数的示例。 关于我的模拟是怎么错的有什么想法吗?
如果你想使用该方法的简单存根,那么你可以做类似的事情
val client = mock[Client]
when(client.prepareAndQuery[Foo](any, any)(any)) thenReturn Future.successful(<whatever you want>)
无论如何都会返回<whatever you want>
我想
说的是,使用任何"模拟"框架在scala中都是一个危险信号。理想情况下,您应该能够通过提供自己的客户端实现来"模拟"。
class MockMysqlClient extends Client {
...
}
只需覆盖/实现应该从数据库返回值的方法。