在“使用”标准库函数中测试 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标准库函数总结 ( apply 函数 | let 函数 | run 函数 | with 函数 | also 函数 | takeIf 函数 | takeUnless 函数 )
Kotlin标准库函数总结 ( apply 函数 | let 函数 | run 函数 | with 函数 | also 函数 | takeIf 函数 | takeUnless 函数 )