4

我正在尝试模拟 Android 上下文以从资源 id 返回一个字符串。但是我无法将存根与调用匹配,我认为这是因为可变参数。但是我是新手,所以我可能会错过一些非常容易的事情。

我以这种方式模拟上下文:

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

4

2 回答 2

1

1.9.1 版引入了一些额外的匹配器来匹配可变参数。

https://mockk.io/#varargs

于 2019-02-15T18:35:43.377 回答
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>) = ...
}

foo()然后用mockk测试非可变参数函数。

我知道这是一个丑陋的解决方法,但如果你找到更好的解决方法,请告诉我:)

于 2019-01-24T13:24:19.867 回答