【问题标题】:Using mockk to match any varargs使用 mockk 匹配任何可变参数
【发布时间】:2019-01-23 12:06:15
【问题描述】:

我正在尝试模拟 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

【问题讨论】:

  • 我没有投反对票,但认为此类事情应仅作为问题报告。关于 SO 的问题更多是针对文档等中缺少的内容
  • @oleksiyp mockk 的文档没有描述如何处理可变参数,因此文档中缺少它。当问这个问题时,我不清楚这是库的问题,我仍然不确定没有比回退到不同的模拟框架更好的解决方法。也许有人还有一个我想不出来的想法。

标签: android kotlin mockk


【解决方案1】:

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

https://mockk.io/#varargs

【讨论】:

    【解决方案2】:

    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() 函数。

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

    【讨论】:

    • 感谢问题参考,为此点赞。我真的无法解决问题,因为我试图存根的函数不是我的,而是来自上下文。我想我可能不得不用 Mockito 或 java 中的其他东西来模拟它,然后将它传递给 Kotlin 代码。
    • 希望有一些时间来做这些改变。我有另一个人想在编码方面帮助我,但首先我们需要一起设计它。两种方式我都不能保证它会很快
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2017-06-20
    • 2017-08-12
    • 2016-12-16
    • 2011-11-21
    • 2023-03-07
    • 2018-04-02
    相关资源
    最近更新 更多