scalamock 模拟 java 接口方法可变参数
scalamock mocking java interface method varargs
我需要从 java 接口
模拟一个带有可变参数的方法
public interface MyClient {
MyResponse indexPrivileges(IndexPrivilege... parameters);
}
我正在用
嘲笑它
(mockMyClient.indexPrivileges _).expects(*).returns(response)
但是报错
[error] /projects/lib-scala-projects/src/test/scala/com/example/MyManagerTest.scala:67: value expects is not a member of com.example.parameters.IndexPrivilege* => com.example.MyResponse
[error] (mockMyClient.indexPrivileges _).expects(*).returns(response)
[error] ^
此外,我尝试传递一个 IndexPrivilege 的 Seq 无济于事
(mockMyClient.indexPrivileges _).expects(privileges).returns(response)
有什么想法吗?
与 Scalamock 4.1.0 合作,我知道有几种可能性可以使这项工作成功。
第一个是在 expects
方法中使用 MatchAny
匹配器。这看起来像 (mockMyClient.indexPrivileges _).expects(new MatchAny()).returns(response)
。
这将允许传递给模拟的任何内容(来自 documentation Matcher that matches everything
)。这种方法的缺点是它匹配所有内容。
第二种方法是使用 ArgThat
匹配器。 ArgThat,是一个Matcher that uses provided predicate to perform matching
。这意味着您可以对函数的输入执行任何您想要的验证。假设您只想检查 IndexPrivilege
的所有值是否都传递给了函数,您可以像这样编写测试:
val indexPrivilegeLengthValidation = new ArgThat[mutable.WrappedArray[IndexPrivilege]](
(irArray: mutable.WrappedArray[IndexPrivilege]) => irArray.length == IndexPrivilege.values.length,
None
)
(mockMyClient.indexPrivileges_).expects(indexPrivilegeLengthValidation).returns(response)
我相信还有其他方法可以处理模拟可变参数,但这两种方法过去对我来说效果很好。
我需要从 java 接口
模拟一个带有可变参数的方法public interface MyClient {
MyResponse indexPrivileges(IndexPrivilege... parameters);
}
我正在用
嘲笑它(mockMyClient.indexPrivileges _).expects(*).returns(response)
但是报错
[error] /projects/lib-scala-projects/src/test/scala/com/example/MyManagerTest.scala:67: value expects is not a member of com.example.parameters.IndexPrivilege* => com.example.MyResponse
[error] (mockMyClient.indexPrivileges _).expects(*).returns(response)
[error] ^
此外,我尝试传递一个 IndexPrivilege 的 Seq 无济于事
(mockMyClient.indexPrivileges _).expects(privileges).returns(response)
有什么想法吗?
与 Scalamock 4.1.0 合作,我知道有几种可能性可以使这项工作成功。
第一个是在 expects
方法中使用 MatchAny
匹配器。这看起来像 (mockMyClient.indexPrivileges _).expects(new MatchAny()).returns(response)
。
这将允许传递给模拟的任何内容(来自 documentation Matcher that matches everything
)。这种方法的缺点是它匹配所有内容。
第二种方法是使用 ArgThat
匹配器。 ArgThat,是一个Matcher that uses provided predicate to perform matching
。这意味着您可以对函数的输入执行任何您想要的验证。假设您只想检查 IndexPrivilege
的所有值是否都传递给了函数,您可以像这样编写测试:
val indexPrivilegeLengthValidation = new ArgThat[mutable.WrappedArray[IndexPrivilege]](
(irArray: mutable.WrappedArray[IndexPrivilege]) => irArray.length == IndexPrivilege.values.length,
None
)
(mockMyClient.indexPrivileges_).expects(indexPrivilegeLengthValidation).returns(response)
我相信还有其他方法可以处理模拟可变参数,但这两种方法过去对我来说效果很好。