【问题标题】:Mocking scala method with functional parameter using Mockito使用 Mockito 模拟具有功能参数的 scala 方法
【发布时间】:2016-02-04 01:29:43
【问题描述】:

与 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 的新手,我还没有找到模拟带有函数参数的函数的示例。对我的模拟错误有什么想法吗?

【问题讨论】:

  • 如果你想用基于 JDBC 的持久层进行单元测试/模拟,可以看看tour.acolyte.eu.org

标签: postgresql scala unit-testing mockito finagle


【解决方案1】:

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

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

无论如何都会返回&lt;whatever you want&gt;

【讨论】:

    【解决方案2】:

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

    class MockMysqlClient extends Client {
    ...
    }
    

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

    【讨论】:

    • mockito 是 scala 中使用的标准模拟框架。在很多场景中,您都想模拟或监视 Scala 类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2015-12-13
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多