我正在尝试将传递到使用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(。事实证明,在运行未经其测试的方法之前,我正在向前伸出"使用"功能。如果取出存根,则"使用"函数可以通过模拟