Как проверить, что конкретный лямбда-метод был передан в качестве аргумента с mockito

У меня есть класс Kotlin (задача была упрощена, чтобы иметь базовый пример), в нем есть метод testedMethod(), на котором я хочу протестировать взаимодействия.

Я хочу убедиться, что в anotherMethod() передается правильный параметр, моя проблема в том, что параметр является не значением, а лямбда-функцией.

Я ищу простое решение в Kotlin, оно может быть или не быть основано на это решение для Java.

class TestedClass {

    fun testedMethod() {
        anotherMethod({ passedMethod() })
    }

    fun passedMethod() {}

    fun anotherMethod(lambdaParameter: () -> Unit) {
        // Does something with lambdaParameter
    }
}

person Sebastian    schedule 23.03.2018    source источник
comment
Если лямбда используется/вызывается внутри anotherMethod, то смоделируйте passedMethod. После чего вы выполняете testedMethod, а затем проверяете, был ли вызван фиктивный passedMethod.   -  person Nkosi    schedule 23.03.2018


Ответы (2)


Это решение, которое я в итоге использовал.

По сути, вы создаете spy тестируемого класса, чтобы иметь возможность проверить его собственный метод, и вы используете argumentCaptor для захвата переданной лямбды и возможности вызывать то, что в нем есть.

import com.nhaarman.mockito_kotlin.argumentCaptor
import com.nhaarman.mockito_kotlin.spy
import com.nhaarman.mockito_kotlin.verify

@Test
fun lambdaParameterPassedIsCorrect() {
    val testedClass = TestedClass()
    val spyOfTestedClass = spy(testedClass)

    val captor = argumentCaptor<() -> Unit>()

    spyOfTestedClass.testedMethod()

    verify(spyOfTestedClass).anotherMethod(captor.capture())
    // Invoke the function passed as a parameter 
    // and then verify that the expected method was called
    val function = captor.firstValue
    function.invoke()
    verify(spyOfTestedClass).passedMethod()
}

Я все еще был бы заинтересован в более простом решении.

person Sebastian    schedule 04.04.2018
comment
Я пытаюсь реализовать свой случай на основе вашего ответа, но потерпел неудачу, например, val captor = argumentsCaptor‹() -> Unit›() -- выдает мне ошибку - person Alexey Simchenko; 26.02.2021

Вы можете использовать библиотеку mockito_kotlin, в которой есть функция «проверить».

  verify(TestedClass, times(1)).anotherMethod(eq(passedMethod))

Которые проверяют, что метод "anotherMethod" класса "TestedClass" вызывается один раз с параметром, равным "passedMethod"

person Nizan Ifrach    schedule 25.03.2018
comment
Не могли бы вы предоставить пример кода с полным синтаксисом, который компилируется и где проходит тест? Я думал, что это будет так просто, прежде чем публиковать этот вопрос;) - person Sebastian; 26.03.2018