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
,那就太好了。
谢谢。
答案 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。