我在下面的表单上有一些代码:
@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>
我使用了模仿迷幻药2。
当使用选择查询(包含“ 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
的模拟而不是 eq(function2)来返回MyObject对象吗?
答案 0 :(得分:1)
我认为您只需要指定设置会话模拟时期望映射器返回的类型即可-您的情况看起来是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")))
}