8

ScalaTest 中的 Mockito答案是否有替代方案?我正在浏览它的文档,但没有找到任何东西。

例如,我想对存根方法的参数执行一些逻辑。在 Mockito 中,我会做这样的事情:

when(mock.create(any(A.class))).thenAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
        A firstArg = (A) invocation.getArguments()[0];
        firstArg.callMethod();
        return null;
    }
});

在 ScalaTest 中,我也可以使用 Mockito。但是,如果有一些对 Scala 更友好的语法来定义这样的Answer.

谢谢你。

4

4 回答 4

10

我刚找到这篇博文。它描述了如何使用隐式转换来实现你想要的。如果您定义这样的隐式转换

implicit def toAnswerWithArgs[T](f: InvocationOnMock => T) = new Answer[T] {
    override def answer(i: InvocationOnMock): T = f(i)
}

你可以thenAnswer用一个简单的函数作为参数调用:

when(mock.someMethodCall()).thenAnswer((i) => calculateReturnValue())

当您的模拟方法没有参数时,还有一个稍短的替代版本。点击链接了解详情。

于 2016-10-14T13:26:03.110 回答
3

定义这个辅助函数:

def answer[T](f: InvocationOnMock => T): Answer[T] = {
  new Answer[T] {
    override def answer(invocation: InvocationOnMock): T = f(invocation)
  }
}

并像这样使用它,例如返回Future[MyClass]包含传递给方法的任何参数的 a:

when(myRepository.create(any[MyClass]())).thenAnswer(answer({ invocation =>
  Future.successful(invocation.getArguments.head.asInstanceOf[MyClass])
}))
于 2016-09-29T21:39:25.823 回答
2

如果你混入 trait MockitoSugar,你可以创建一个 mock 并使用以下语法传递一个答案:

mock[Collaborator](new Answer(){ ... })
于 2013-02-22T23:02:29.070 回答
1

你试过ScalaMock吗?它还与 ScalaTest 集成,并提供对 Scala 更友好的 API。

于 2013-02-22T14:39:39.657 回答