scalamock 模拟 java 接口方法 varargs

roj*_*anu 5 unit-testing scalatest scalamock

我需要使用 java 接口中的可变参数来模拟一个方法

public interface MyClient {
    MyResponse indexPrivileges(IndexPrivilege... parameters);
}
Run Code Online (Sandbox Code Playgroud)

我在嘲笑它

(mockMyClient.indexPrivileges _).expects(*).returns(response)
Run Code Online (Sandbox Code Playgroud)

但得到一个错误

[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]                                        ^
Run Code Online (Sandbox Code Playgroud)

另外,我尝试传递 IndexPrivilege 的 Seq 无济于事

(mockMyClient.indexPrivileges _).expects(privileges).returns(response)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

cah*_*ltr 2

使用Scalamock 4.1.0,我知道有几种可能性可以完成这项工作。

第一个是MatchAnyexpects方法中使用匹配器。这看起来像(mockMyClient.indexPrivileges _).expects(new MatchAny()).returns(response)。这将允许传递给模拟的任何内容(来自文档 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)
Run Code Online (Sandbox Code Playgroud)

我相信还有其他方法可以模拟可变参数,但这两种方法过去对我来说效果很好。