Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您能捕获并检查提供给ScalaMock测试中的方法的参数吗?_Scala_Mocking_Scalatest - Fatal编程技术网

您能捕获并检查提供给ScalaMock测试中的方法的参数吗?

您能捕获并检查提供给ScalaMock测试中的方法的参数吗?,scala,mocking,scalatest,Scala,Mocking,Scalatest,Java Mocking framework Mockito有一个名为ArgumentCaptor的实用程序类,该类在多次调用验证中的方法时累积一个值列表 ScalaMock有类似的机制吗?在中有一个引擎盖下的机制可以实现这一点,但它目前没有暴露给客户端代码 您对此的用例是什么 您可以使用where或onCall文档(分别在“谓词匹配”和“返回值”标题下)来实现所需功能。在中,您可以使用以下功能: myMock.myFunction(argument) answers( passedAr

Java Mocking framework Mockito有一个名为
ArgumentCaptor
的实用程序类,该类在多次调用验证中的方法时累积一个值列表


ScalaMock有类似的机制吗?

在中有一个引擎盖下的机制可以实现这一点,但它目前没有暴露给客户端代码

您对此的用例是什么

您可以使用
where
onCall
文档(分别在“谓词匹配”和“返回值”标题下)来实现所需功能。

在中,您可以使用以下功能:

myMock.myFunction(argument) answers(
    passedArgument => "something with"+passedArgument
)
这映射到引擎盖下的Mockito的ArgumentCaptor。

使用:

根据,您可以直接使用specs2匹配器,例如

val myArgumentMatcher: PartialFunction[ArgumentType, MatchResult[_]] = {
  case argument => argument mustEqual expectedValue
}
there was one(myMock).myFunction(beLike(myArgumentMatcher))
这个解决方案的酷之处在于,分部函数允许非常大的灵活性。你可以在你的参数上进行模式匹配,等等。当然,如果你真的只需要比较参数值,那么就不需要部分函数了,你可以这样做

there was one(myMock).myFunction(==_(expectedValue))

另一种选择是通过扩展现有的匹配器来实现您自己的参数捕获器。类似的东西应该可以做到这一点(对于scalamock 3):

您可以通过将该特性添加到测试类来使用这个新匹配器

val captor = new ArgumentCaptor[MyClass]

(obj1.method(_: MyClass)).expects(capture(captor)).returns(something)

println(captor.capturedValue)

好问题。用例正是您使用
ArgumentCaptors
的目的:确保调用序列完全按照您期望的值传递。我认为最终使用了
onCall
来累积结果列表,然后再对其进行验证。“此处”的链接现在已断开。也许是一个合适的替代品。@Paul是否已将其添加到ScalaMock 4.x中?我觉得参数匹配并不完全是参数捕获。我已经通过这种方式将ScalaMock的维护交给Philipp Meyerhoefer,
passedArgument
的类型是
Any
。有没有办法在闭包中维护其类型信息?这样我必须强制转换它才能使用它的成员。我想你必须声明类型
passedArgument:Mine=>…
对我来说是最好的,当然,不需要做真正的工作。
trait TestMatchers extends Matchers {

    case class ArgumentCaptor[T]() {
        var valueCaptured: Option[T] = None
    }

    class MatchAnyWithCaptor[T](captor: ArgumentCaptor[T]) extends MatchAny {
        override def equals(that: Any): Boolean = {
           captor.valueCaptured = Some(that.asInstanceOf[T])
           super.equals(that)
        }
    }

    def capture[T](captor: ArgumentCaptor[T]) = new MatchAnyWithCaptor[T](captor)
}
val captor = new ArgumentCaptor[MyClass]

(obj1.method(_: MyClass)).expects(capture(captor)).returns(something)

println(captor.capturedValue)