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

     2023-03-30     49

关键词:

【中文标题】在“使用”标准库函数中测试 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扩展函数③(定义扩展文件|重命名扩展函数|kotlin标准库扩展函数)(代码片段)

...扩展文件如果定义的扩展函数需要在多个Kotlin代码文件中使用,则需要在单独的Kotlin文件中定义,该文件被称为扩展文件;定义标准库函数的Standard.kt就是独立的扩展文件;代码示例:扩展文件一般都单独定义在一个Package中,命名一般是... 查看详情

kotlin标准库函数①(apply标准库函数|let标准库函数)(代码片段)

文章目录一、apply标准库函数二、let标准库函数Kotlin语言中,在Standard.kt源码中,为所有类型定义了一批标准库函数,所有的Kotlin类型都可以调用这些函数;一、apply标准库函数Kotlin标准库函数中的apply函数,该函数可以看作实例对象的... 查看详情

kotlin标准库函数④(takeif标准库函数|takeunless标准库函数)(代码片段)

文章目录一、takeIf标准库函数二、takeUnless标准库函数Kotlin语言中,在Standard.kt源码中,为所有类型定义了一批标准库函数,所有的Kotlin类型都可以调用这些函数;一、takeIf标准库函数takeIf函数的返回值由其Lambda表达式参数的返回值确... 查看详情

kotlin标准库函数总结(apply函数|let函数|run函数|with函数|also函数|takeif函数|takeunless函数)(代码片段)

...用指定函数[block],并返回'this'值。**有关详细使用信息,请参阅[scopefunctions]的文档*(https://kotlinlang.org/docs/reference/scope-functions.html#apply)。*/@kotlin.internal.InlineOnlypublicinlinefun<T> 查看详情

kotlin标准库函数总结(apply函数|let函数|run函数|with函数|also函数|takeif函数|takeunless函数)(代码片段)

文章目录一、apply标准库函数二、let标准库函数三、run标准库函数1、run函数传入Lambda表达式作为参数2、run函数传入函数引用作为参数四、with标准库函数五、also标准库函数六、takeIf标准库函数七、takeUnless标准库函数Kotlin语言中,... 查看详情

kotlin标准库函数②(run标准库函数|run函数传入lambda表达式作为参数|run函数传入函数引用作为参数)(代码片段)

文章目录一、run标准库函数1、run函数传入Lambda表达式作为参数2、run函数传入函数引用作为参数Kotlin语言中,在Standard.kt源码中,为所有类型定义了一批标准库函数,所有的Kotlin类型都可以调用这些函数;一、run标准库函数1、run函数传... 查看详情

如何在 Kotlin 标准库(多平台)上获取当前的 unixtime

...库中做到这一点?【问题讨论】:【参考方案1】:可以使用实验性Kotlin日期 查看详情

kotlin中标准库函数(applyletrunwithalsotakeiftakeunless)的使用详解(代码片段)

...传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda表达式给apply函数执行,它会返回配置好的接收者。可以看到,调用一个个函数类配置接收者时,变量名就省略掉了。这是因为,在l... 查看详情

kotlin中标准库函数(applyletrunwithalsotakeiftakeunless)的使用详解(代码片段)

...传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda表达式给apply函数执行,它会返回配置好的接收者。可以看到,调用一个个函数类配置接收者时,变量名就省略掉了。这是因为,在l... 查看详情

kotlin学习与实践lambda

...Java8才引入Lambda,所以这里还是提一下Lambda。而且Kotlin中使用Lambda的确很赞。Lambda表达式简称lambda,本质上就是一段可以传递给其他函数的一小段代码,可以轻松的把通用的代码结构抽取成库函数。*函数式编程可以把函数当做值... 查看详情

每天学一点kotlin--函数:泛型函数

...要写一次函数体不变的函数。这时候泛型就派上用场了。使用泛型就可以让函数接受任何类型的参数。1.2要使用泛型,就要在关键字fun后面加上泛型占位符,在参数中使用这个占位符。举个栗子:1.3举个栗子2: 查看详情

kotlin扩展函数总结★(超类扩展函数|私有扩展函数|泛型扩展函数|扩展属性|定义扩展文件|infix关键字用法|重命名扩展函数|标准库扩展函数)(代码片段)

...let函数是泛型扩展函数六、扩展属性七、可空类扩展八、使用infix关键字修饰单个参数扩展函数的简略写法九、定义扩展文件十、重命名扩展函数十一、Kotlin标准库扩展函数一、扩展函数简介为现有类定义扩展函数,可以在不修改... 查看详情

kotlin协程协程底层实现①(kotlin协程分层架构|基础设施层|业务框架层|使用kotlin协程基础设施层标准库api实现协程)(代码片段)

文章目录一、Kotlin协程分层架构二、使用Kotlin协程基础设施层标准库Api实现协程一、Kotlin协程分层架构Kotlin协程分层架构:在Kotlin中,协程分为两层;基础设施层:Kotlin提供了协程标准库Api,为协程提供概念,语义支持,是协程实现的基... 查看详情

kotlin协程协程底层实现①(kotlin协程分层架构|基础设施层|业务框架层|使用kotlin协程基础设施层标准库api实现协程)(代码片段)

文章目录一、Kotlin协程分层架构二、使用Kotlin协程基础设施层标准库Api实现协程一、Kotlin协程分层架构Kotlin协程分层架构:在Kotlin中,协程分为两层;基础设施层:Kotlin提供了协程标准库Api,为协程提供概念,语义支持,是协程实现的基... 查看详情

从 Swift 访问 Kotlin 标准库

】从Swift访问Kotlin标准库【英文标题】:AccessKotlinStandardLibraryfromSwift【发布时间】:2019-04-0520:03:03【问题描述】:在我的KotlinMultiplatform项目中,我试图从Swift访问在kotlin-stdlib中定义的Kotlin类型。TL;DR:StdLib类型/方法似乎不会导致... 查看详情

kotlin扩展函数总结★(超类扩展函数|私有扩展函数|泛型扩展函数|扩展属性|定义扩展文件|infix关键字用法|重命名扩展函数|标准库扩展函数)(代码片段)

...let函数是泛型扩展函数六、扩展属性七、可空类扩展八、使用infix关键字修饰单个参数扩展函数的简略写法九、定义扩展文件十、重命名扩展函数十一、Kotlin标准库扩展函数一、扩展函数简介为现有类定义扩展函数,可以在不修改... 查看详情

kotlin学习与实践基础

...是类。和Java不同Kotlin没有声明数组类型的特殊语法。*f.使用println代替了System.out.println。    Kotlin标准库给Java的标准库函数提供了许多语法更简洁的包装,而println就是其中一个。*g 查看详情

在哪里可以找到为验证 python 标准库中的函数而进行的测试?

...问题描述】:我目前在学校参加一个小组项目。我们正在使用python标准库,我们想知道它是否已经过python团队的测试。换句话说,是否有任何文档或开源unittests 查看详情