как смоделировать / сопоставить лямбду в сигнатуре метода kotlin - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть код в следующей форме:

@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 в моем случае не является действительно картографом, это не то, что я пытаюсь смоделировать, оно никогда не совпадает, и макет никогда не вызывается.

Итак, что я могу вставить в макет session, select вместо eq (function2) в приведенном выше коде, чтобы получить объект MyObject?

1 Ответ

0 голосов
/ 19 сентября 2018

Я думаю, вам просто нужно указать тип шрифта, который ваш маппер должен возвращать при настройке макета сеанса - в вашем случае он выглядит как 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")))
}
...