5

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

ScalaMock 有类似的机制吗?

4

5 回答 5

2

在ScalaMock3的预览版中有一个幕后机制可以做到这一点,但它目前还没有暴露给客户端代码。

你的用例是什么?

您可能可以通过使用where在此处onCall记录(分别在“谓词匹配”和“返回值”标题下)来实现所需的内容。

于 2012-09-11T12:28:17.827 回答
2

Specs2 中,您可以使用以下内容:

myMock.myFunction(argument) answers(
    passedArgument => "something with"+passedArgument
)

这映射到引擎盖下的 Mockito 的 ArgumentCaptor。

于 2013-01-26T21:56:43.880 回答
0

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

val myArgumentMatcher: PartialFunction[ArgumentType, MatchResult[_]] = {
  case argument => argument mustEqual expectedValue
}
there was one(myMock).myFunction(beLike(myArgumentMatcher))

这个解决方案很酷的一点是,部分函数允许非常大的灵活性。您可以对参数进行模式匹配等。当然,如果您真的只需要比较参数值,则不需要偏函数,您可以这样做

there was one(myMock).myFunction(==_(expectedValue))
于 2015-09-30T15:23:06.073 回答
0

另一种选择是通过扩展现有的匹配器来实现您自己的参数捕获器。那种东西应该可以解决问题(对于scalamock 3):

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)
于 2016-10-16T16:14:56.763 回答
-1

使用ArgumentCapture

val subject = new ClassUnderTest(mockCollaborator)
// Create the argumentCapture
val argumentCapture = new ArgumentCapture[ArgumentClazz]

// Call the method under test
subject.methodUnderTest(methodParam)

// Verifications
there was one (mockCollaborator).someMethod(argumentCapture)
val argument = argumentCapture.value
argument.getSomething mustEqual methodParam
于 2013-08-24T03:07:16.130 回答