Mockito在ScalaTest中的答案

时间:2013-02-22 12:33:55

标签: scala mockito scalatest

ScalaTest中是否有Mockito Answer的替代品?我正在经历documentation,但没有找到任何东西。

我想,例如,对存根方法的参数执行一些逻辑。在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 个答案:

答案 0 :(得分:9)

我刚发现this blog post。它描述了如何使用隐式转换来实现您想要的。如果您定义这样的隐式转换

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())

当mocked方法没有参数时,还有一个略短的替代版本。请点击链接了解详情。

答案 1 :(得分:2)

如果混合使用特征MockitoSugar,您可以创建一个模拟并使用以下语法将答案传递给它:

mock[Collaborator](new Answer(){ ... })

答案 2 :(得分:2)

定义此辅助函数:

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

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

when(myRepository.create(any[MyClass]())).thenAnswer(answer({ invocation =>
  Future.successful(invocation.getArguments.head.asInstanceOf[MyClass])
}))

答案 3 :(得分:1)

你试过ScalaMock吗?它也是integrated with ScalaTest,并提供了更多Scala友好的API。