【问题标题】:mockk, how to verify a function is called with Map type and interface typemockk,如何验证使用Map类型和接口类型调用的函数
【发布时间】:2022-12-03 03:12:49
【问题描述】:

该类有一个功能:

fun theFunc(uri: Uri, theMap: Map<String, String>?, callback: ICallback) {
  ......
}

并想验证它是用正确的参数类型调用的

io.mockk.verify { mock.theFunc(ofType(Uri::class), ofType(Map<String,  String>::class), ofType(ICallbak::class)) }

ofType(Uri::class) 没问题,

ofType(Map&lt;String, String&gt;::class 出现错误:

ofType(ICallbak::class) 得到错误:

ICallback 没有伴随对象,因此必须初始化 这里。

ofType()Map接口怎么用?

【问题讨论】:

    标签: kotlin mockk mockk-verify


    【解决方案1】:

    问题是由于type erasure,泛型参数在运行时丢失,因此语法不允许在该上下文中指定泛型参数。您可以写 Map::class 但不能写 Map&lt;String, String&gt;::class,因为 Map&lt;String, String&gt; 在运行时只是 Map

    所以,你可以这样称呼它:

    verify { mock.theFunc(ofType(Uri::class), ofType(Map::class), ofType(ICallback::class)) }
    

    那可行。然而,还有一个版本的函数ofType 接受通用参数,所以你可以使用这个:

    verify { mock.theFunc(ofType<Uri>(), ofType<Map<String, String>>(), ofType<ICallback>()) }
    

    【讨论】:

    • 谢谢@klitos! ofType<Map<String, String>>() 通过了编译,但在运行时映射为空,因此未找到匹配项。如何在验证中放入可为空的参数? ofType(Map::class) 不起作用,但 ofType(ICallback::class) 实际上起作用了
    • 如果您不是在寻找特定的参数类型,即 null 也是可以接受的,您可以只使用 verify { mock.theFunc(any(), any(), any()) }
    • 我的意思是,您可以使用 or 函数来组合匹配器,即 verify { mock.theFunc(ofType&lt;Uri&gt;(), or(ofType&lt;Map&lt;String, String&gt;(), isNull()), ofType&lt;ICallback&gt;()) },但是如果您只能使用 any(),那将毫无意义。
    【解决方案2】:

    你需要使用mapOf&lt;String,String&gt;::class

    io.mockk.verify { mock.theFunc(ofType(Uri::class), ofType(mapOf<String,String>()::class), ofType(ICallbak)) }
    

    对于界面,您可以创建模拟对象。并将其放入 ofType 中。

    val callbackMock: ICallback = mockk()
    
    io.mockk.verify { mock.theFunc(ofType(Uri::class), ofType(mapOf<String,String>()::class), ofType(callbackMock::class)) }
    

    【讨论】:

    • 谢谢,界面呢?
    • 我更新了。你能试试吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2018-09-15
    • 2021-11-15
    • 2017-04-10
    • 1970-01-01
    • 2013-03-08
    • 2020-07-31
    相关资源
    最近更新 更多