所以我有这个模拟:
when(myMock.someMethod(anyString(), anyString(), anyString()))
.thenAnswer(new Answer[Path] {
override def answer(invocation: InvocationOnMock): Path =
temporaryFolder.getRoot.toPath.resolve(invocation.getArgument(2).asInstanceOf[String])
})
这很好用。但是,根据intelliJ的建议,进行一些在线阅读,似乎这样会更清洁:
when(myMock.someMethod(anyString(), anyString(), anyString()))
.thenAnswer((invocation: InvocationOnMock) =>
temporaryFolder.getRoot.toPath.resolve(invocation.getArgument(2).asInstanceOf[String]))
但是,当我尝试编译它时,出现编译错误:
Error:(56, 50) type mismatch;
found : org.mockito.invocation.InvocationOnMock => java.nio.file.Path
required: org.mockito.stubbing.Answer[_]
.thenAnswer((invocation: InvocationOnMock) => temporaryFolder.getRoot.toPath.resolve(invocation.getArgument(2).asInstanceOf[String]))
为什么?我什至不理解此消息,难道不明白该参数是lambda吗?
我正在使用Mockito Core 2.7.19。
答案 0 :(得分:2)
如果您使用Scala版本的Mockito(mockito-scala),则可以用更简单的方式编写它,因此您的代码如下:
when(myMock.someMethod(anyString(), anyString(), anyString()))
.thenAnswer((invocation: InvocationOnMock) =>
temporaryFolder.getRoot.toPath.resolve(invocation.getArgument(2).asInstanceOf[String]))
将成为:
myMock.someMethod(*,*,*) shouldAnswer ((_: String, v: String) => temporaryFolder.getRoot.toPath.resolve(v))
请注意,我只是传递了一个标准的Scala函数,该函数将忽略第一个参数,并在不需要时完全省略第三个参数。
免责声明,我是该库的维护者
答案 1 :(得分:1)
使用lambda创建单一抽象方法类型是Scala 2.12中的一项新功能。正如您在注释中指出的那样,您正在使用2.11。考虑升级,否则您将无法使用长格式。