在“使用”标准库函数中测试 Kotlin lambda

Posted

技术标签:

【中文标题】在“使用”标准库函数中测试 Kotlin lambda【英文标题】:Test Kotlin lambda within "use" standard library function 【发布时间】:2019-10-04 19:21:14 【问题描述】:

我正在尝试在传递给使用 Kotlin 标准库内联函数的 lambda 函数中对代码进行单元测试。我尝试将 thenAnswer 与 mockito 一起使用,但无法使用 Mockito-Kotlin 库中的 isA() 或 any() ArgumentMatchers 编译代码。这是sn-ps的代码:

待测代码

sessionFactory.openSession().use  session ->
    // Code I want to test

单元测试代码

val sessionFactory: SessionFactory = mock()
val session: Session = mock()
whenever(sessionFactory.openSession()).thenReturn(session)
whenever(session.use(isA())).thenAnswer
    @Suppress("UNCHECKED_CAST")
    (it.arguments[0] as (Any) -> Any).invoke(session)

我在正确的轨道上吗?一种解决方法是不使用 use 函数并在 finally 块中显式关闭 Hibernate 会话对象,但我不想这样做。

【问题讨论】:

【参考方案1】:

如果你直接测试你的代码,没有openSession().use,那么痛苦会减轻

生产代码:

    sessionFactory.openSession().use  session ->
        codeIwantToTest(session)
    


// visible for testing
fun codeIwantToTest(session: Session) 
    // your code goes here

测试代码:

private val session: Session = mock()

@Test
fun `some test`() 
    // some set up

    codeIwantToTest(session)

    // asserts and verify(session)

如果您怀疑 use 是否能正常工作,请像这样测试它(但这绝对是一种偏执狂)

@Test
fun `test library function use`() 
    session.use  session ->
        session.beginTransaction()
    

    verify(session).beginTransaction()
    verify(session).close()

【讨论】:

【参考方案2】:

感谢 Frank Neblung 的回复。事实证明,在没有它的情况下运行被测方法之前,我正在跳过“使用”函数。如果你取出存根,“使用”函数可以在模拟中正常执行。

【讨论】:

以上是关于在“使用”标准库函数中测试 Kotlin lambda的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )

Kotlin标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

Kotlin标准库函数 ④ ( takeIf 标准库函数 | takeUnless 标准库函数 )

Kotlin学习与实践 Lambda

Kotlin标准库函数总结 ( apply 函数 | let 函数 | run 函数 | with 函数 | also 函数 | takeIf 函数 | takeUnless 函数 )

Kotlin标准库函数总结 ( apply 函数 | let 函数 | run 函数 | with 函数 | also 函数 | takeIf 函数 | takeUnless 函数 )