在标准库函数中测试 Kotlin lambda "use"



我正在尝试将传递到使用Kotlin Standard Library内联函数的lambda函数中。我尝试使用Mockito使用ThenAnswer,但无法通过Mockito-Kotlin库中的ISA((或任何((参数匹配者进行编译。这是代码片段:

测试中的代码

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)
}

我在正确的道路上吗?一个解决方法是不使用使用功能,并明确关闭Hibernate Session对象,但我不必这样做。

,如果您直接测试代码,而没有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()
}

感谢您的回应弗兰克·内布隆(Frank Neblung(。事实证明,在运行未经其测试的方法之前,我正在向前伸出"使用"功能。如果取出存根,则"使用"函数可以通过模拟

执行正常执行。

相关内容

  • 没有找到相关文章

最新更新