我试图在传递给使用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会话对象,但我不想这样做。
答案 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”功能可以通过模拟程序很好地执行。