【问题标题】:Writing tests to verify passing a function as argument in Scala编写测试以验证在 Scala 中将函数作为参数传递
【发布时间】:2015-02-26 18:18:11
【问题描述】:

我有这样的事情:

def fnA(argA: Int, argB: Int, argC: Int): Seq[Int] = {
   tryRequest {
     ...
   }
}

def tryRequest[T](f: => T): T = {
    try {
        f
    } catch {
        ...
    }
}

我正在尝试弄清楚如何使用 Mockito/ScalaTest 进行测试。我想确保 1. 我的返回类型是我期望的(当我调用 fnA 时是 Seq[Int]),或者 2. 我在调用它时将正确的类型传递给 tryRequest( (Int, Int, Int) => Seq[Int] 当我调用 fnA 时)。我尝试了以下变体:

exampleInstance.fnA(1, 2, 3)
there was one(exampleInstance).tryRequest(any)

但我总是得到类似的东西

Argument(s) are different! Wanted:
    exampleInstance.tryRequest(
        ($anonfun$apply$17) <function0>
    );

Actual invocation has different arguments:
    exampleInstance.tryRequest(
        ($anonfun$fnA$1) <function0>
    );

任何想法我可以如何准确地测试这个?谢谢!

【问题讨论】:

标签: scala scalatest


【解决方案1】:

尚不完全清楚您将传递什么 - 您似乎认为您将 (Int, Int, Int) =&gt; Seq[Int] 传递给 tryRequest,但您给出的 fnA 的定义并没有这样做(它已经采用了Int 调用 tryRequest 之前的参数)。但是按照你写的而不是代码:

通常不可能比较函数的相等性,并且该语法将“真正”创建一个匿名包装器(您是否真的需要 =&gt; T 的惰性,因为无论如何您都在其中传递一个函数?),因此失败。您可以做的是确认传递给内部调用的函数与您已经传递的函数具有一些相同的属性。我不知道花哨的语法,但是对于普通的 Java 测试/模拟库,我会做类似的事情:

val myCaptor = capture[=> ((Int, Int, Int) => Seq[Int])]
expect(exampleInstance.tryRequest(myCaptor.capture()))

exampleInstance.fnA({(a, b, c) => a + b + c})

val functionThatWasPassed = myCaptor.getValue()
assertThat(functionThatWasPassed(3, 4, 5)) isEqualTo 12
assertThat(functionThatWasPassed(-1, 0, 2)) isEqualTo 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多