使用Mockk匹配任何varargs

时间:2019-01-23 12:06:16

标签: android kotlin mockk

我正在尝试模拟Android上下文以从资源ID返回字符串。但是,我很难将存根与调用匹配,我认为这是因为varargs。但是,我是mock的新手,所以我可能会很容易错过一些事情。

我这样模拟上下文:

val context = mockk<Context>()
every { context.getString(any(), any()) } returns stringToReturn

但是在对象上调用getString时,它将引发以下异常:

io.mockk.MockKException: no answer found for: Context(#1).getString(2131689544, [])

如果重要的话,我在被测类中调用与此类似的函数。 formatArgs可能为空,但不必:

protected fun foo(stringResource: Int, vararg formatArgs: Any) {
    val s = context.getString(errorMessageStringResource, *formatArgs)

有什么主意我可以解决这个问题吗?

您可以在此处检查项目并重现异常:Github Project

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

1.9.1版引入了一些额外的匹配器来匹配varargs。

https://mockk.io/#varargs