Как смоделировать / сопоставить лямбду в подписи метода kotlin
У меня есть код в следующей форме:
@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. Обратите внимание на лямбду в сигнатуре метода:
fun <R> select(@Language("SQL") sql: String,
parameters: Map<String, Any?> = mapOf(),
options: StatementOptions = defaultOptions,
mapper: (Row) -> R): List<R>
Я использую mockitokotlin2.
Мне нужно вернуть экземпляр MyObject, когда метод выбора сеанса вызывается с помощью запроса select (содержащего "SELECT foo").
Я думал, что смогу передать макет лямбды, как показано ниже (но тогда он не будет соответствовать вызову метода, который я пытаюсь смоделировать). Приведенный ниже код является попыткой. Но это никогда не совпадает в 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 в моем случае не является действительно картографом, это не то, что я пытаюсь смоделировать, оно никогда не совпадает и mock никогда не вызывается.
Так что я положил в макет session, select
вместо eq(function2) в коде выше, чтобы получить объект MyObject?
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")))
}