使用 mockk 匹配任何可变参数
Using mockk to match any varargs
我正在尝试将 Android 上下文模拟为来自资源 ID 的 return 字符串。但是我无法将存根与调用匹配,我认为这是因为可变参数。但是我是 mockk 的新手,所以我可能会错过一些非常简单的东西。
我这样模拟上下文:
val context = mockk<Context>()
every { context.getString(any(), any()) } returns stringToReturn
但是在对象上调用 getString 时会抛出以下异常:
io.mockk.MockKException: no answer found for: Context(#1).getString(2131689544, [])
如果重要,我在测试中调用class中的函数类似于此。 formatArgs 可以为空但不必为:
protected fun foo(stringResource: Int, vararg formatArgs: Any) {
val s = context.getString(errorMessageStringResource, *formatArgs)
知道如何解决这个问题吗?
您可以在此处检查项目并重现异常:Github Project
mockk v1.9 中有一个相关的未解决问题:https://github.com/mockk/mockk/issues/224(另请参阅参考问题)
我尝试了几种解决方案,但最终创建了重载函数,只是为了使用 mockk 进行测试,例如
class Context {
// Renamed because of same JVM signature
fun foo2(stringResource: Int, vararg formatArgs: Any) = foo(stringResource, formatArgs)
// Function accepts
fun foo(stringResource: Int, formatArgs: args: Array<out Any>) = ...
}
然后用mockk测试非可变参数foo()
函数。
我知道这是一个丑陋的解决方法,但如果您找到更好的解决方法,请告诉我:)
版本 1.9.1 引入了一些额外的匹配器来匹配可变参数。
我正在尝试将 Android 上下文模拟为来自资源 ID 的 return 字符串。但是我无法将存根与调用匹配,我认为这是因为可变参数。但是我是 mockk 的新手,所以我可能会错过一些非常简单的东西。
我这样模拟上下文:
val context = mockk<Context>()
every { context.getString(any(), any()) } returns stringToReturn
但是在对象上调用 getString 时会抛出以下异常:
io.mockk.MockKException: no answer found for: Context(#1).getString(2131689544, [])
如果重要,我在测试中调用class中的函数类似于此。 formatArgs 可以为空但不必为:
protected fun foo(stringResource: Int, vararg formatArgs: Any) {
val s = context.getString(errorMessageStringResource, *formatArgs)
知道如何解决这个问题吗?
您可以在此处检查项目并重现异常:Github Project
mockk v1.9 中有一个相关的未解决问题:https://github.com/mockk/mockk/issues/224(另请参阅参考问题)
我尝试了几种解决方案,但最终创建了重载函数,只是为了使用 mockk 进行测试,例如
class Context {
// Renamed because of same JVM signature
fun foo2(stringResource: Int, vararg formatArgs: Any) = foo(stringResource, formatArgs)
// Function accepts
fun foo(stringResource: Int, formatArgs: args: Array<out Any>) = ...
}
然后用mockk测试非可变参数foo()
函数。
我知道这是一个丑陋的解决方法,但如果您找到更好的解决方法,请告诉我:)
版本 1.9.1 引入了一些额外的匹配器来匹配可变参数。