【问题标题】:Test Kotlin lambda within "use" standard library function在“使用”标准库函数中测试 Kotlin lambda
【发布时间】: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 会话对象,但我不想这样做。

【问题讨论】:

    标签: unit-testing kotlin lambda mockito


    【解决方案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 的回复。事实证明,在没有它的情况下运行被测方法之前,我正在跳过“使用”函数。如果你取出存根,“使用”函数可以在模拟中正常执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-22
        • 2019-01-22
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多