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

时间:2019-05-17 12:48:46

标签: unit-testing kotlin lambda mockito

我试图在传递给使用Kotlin标准库内联函数的lambda函数中对单元代码进行单元测试。我尝试将thenAnswer与Mockito结合使用,但无法从Mockito-Kotlin库中使用isA()或any()ArgumentMatchers进行编译。以下是代码段:

被测代码

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会话对象,但我不想这样做。

2 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

感谢Frank Neblung的回应。事实证明,在没有此方法的情况下运行测试方法之前,我正在准备取消“使用”功能。如果将存根取出,则“ use”功能可以通过模拟程序很好地执行。