繁体   English   中英

如何在Kotlin方法签名中模拟/匹配Lambda

[英]how to mock/match lambda in kotlin method signature

我在下面的表单上有一些代码:

@Language("SQL")
val someSql = """
    SELECT foo
    FROM bar 
    WHERE foo = :foo
    """
return session.select(some, mapOf("foo" to foo)) {
    MyObject(
            foo = it.string("foo"),
    )
}.firstOrNull()

使用com.github.andrewoma.kwery.core中的以下内容 注意方法签名中的lambda:

fun <R> select(@Language("SQL") sql: String,
               parameters: Map<String, Any?> = mapOf(),
               options: StatementOptions = defaultOptions,
               mapper: (Row) -> R): List<R> 

我使用mockitokotlin2。

当使用选择查询(包含“ SELECT foo”)调用会话选择方法时,我需要返回MyObject的实例。

我当时以为可以将模拟传递给lambda,如下所示(但随后它将与我尝试模拟的方法调用不匹配)。 下面的代码是一个尝试。 但是它在eq(function2)永远不匹配:

val function2: (Row) -> Int = mock {
    onGeneric { invoke(any()) }.thenReturn(MyObject(foo="test-foo"))
}

val session = mock<Session> {
    on { select(sql = any(), parameters = any(), options = any(), mapper = eq(function2))}.thenReturn(listOf(MyObject(foo="test-foo")))
} 

在我的情况下,function2并不是真正的映射器,它不等于我要模拟的内容,它永远不会匹配,并且永远不会调用模拟。

那么我该在session, select模拟中添加什么session, select在上面的代码中session, select而不是eq(function2)来返回MyObject对象?

我认为您只需要指定它们的类型即可在设置会话模拟时期望您的映射器返回-在您的情况下看起来是Function1<Row, MyObject>

val session = mock<Session> {
    on { select(sql = anyString(), parameters = anyMap(), options = any(), mapper = any<Function1<Row, MyObject>>())}.thenReturn(listOf(MyObject(foo="test-foo")))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM