我在 mockito-scala 上提出了一个假问题:https ://github.com/mockito/mockito-scala/issues/191 但我仍然坚持我的问题。
所以基本上,我对一种方法给出了答案。我确信使用正确的参数执行存根方法(在其中输入调试模式):
val mocked = mock[Service]
mocked.execute(*, *, *) answers {(f:Parameter, s:Parameter, t:Parameter) =>
s match {
case _:SecondParameter => // Debug mode enter here
Right("Second")
case o => Left(o)
}
})
然后我进行了非常广泛的验证:mocked.method(*, *, *) wasCalled atLeastOnce
但我的测试失败了:
Wanted but not invoked:
mocked.method(
<any>,
<any>,
<any>
);
-> at **hidden**
However, there were exactly 4 interactions with this mock:
mocked.init();
-> at **hidden**
mocked.method(
FirstParameter,
SecondParameter,
ThirdParameter
);
-> at **hidden**
mocked.method(
FirstParameter,
OtherParameter,
ThirdParameter
);
-> at **hidden**
mocked.method(
FirstParameter,
YetAnotherParameter,
ThirdParameter
);
-> at **hidden**
编辑1:mock[Service]
和测试对象之间有一个类。这可能是这个问题的原因吗?
class ServiceProxy(service: Service) {
def execute(p:Parameter) = Future {
val state = service.init()
service.execute(state, p, new ThirdParameter())
}
}
class Subject(proxy:ServiceProxy) {
def doSomething(s:String, n:Int) = {
val parameter = createParameter(s, n)
proxy.execute(parameter)
}
}
// In my test case
val mocked = mock[Service]
mocked.init() returns mock[State]
mocked.execute(*, *, *) answers // Same as above
val subject = new Subject(new ServiceProxy(mocked))
val response = subject.doSomething("A", 1)
Await.result(response, Duration.Inf)
mocked.method(*, *, *) wasCalled atLeastOnce