Как проверить вызовы, сделанные для параметра, используемого в качестве делегата (делегирования)? - PullRequest
1 голос
/ 08 марта 2019

У меня есть класс A, подобный следующему:

class A(b: B) : B by b // Note the implementation of interface B by delegation to parameter b

interface B {
    fun memberFunction() {}
}

fun B.extensionFunction() {}

Теперь я хочу убедиться, что вызывается B#extensionFunction.Как мне это сделать?

Я могу проверить B#memberFunction примерно так:

class BImpl : B // Dummy implementation needed to instantiate interface B

@Test
fun `memberFunction can be verified`() {
    val bSpy = spyk<B>(BImpl)
    val a = A(bSpy)

    a.memberFunction()

    verify { bSpy.memberFunction() }
}

Однако тот же тест для B#extensionFunction не сработает;вместо этого я получаю java.lang.AssertionError.Проверка не пройдена, потому что звонок не состоялся.(Обратите внимание, что вы должны использовать статический макет (используя функцию mockkStatic), чтобы иметь возможность проверить функцию расширения.)

Для справки, используемые библиотеки:

  • org.jetbrains.kotlin: kotlin-stdlib-jdk8: 1.3.11
  • junit: junit: 4.12
  • .

1 Ответ

1 голос
/ 08 марта 2019

Вы можете тривиально проверить, что функция расширения вызывается на самом делегаторе, т.е. в вашем примере a:

@Test
fun `extensionFunction can be verified`() = mockkStatic("your.package.name.FilenameKt") {
    val a = A(BImpl)

    a.extensionFunction()

    verify { a.extensionFunction() }
}

Это выглядит тривиально, но если вызов a.extensionFunction() сделан ниже по потоку от другого вызова в вашем тестовом методе, это проверяет, что метод расширения вызывается на a.

Это работает просто потому, что a является B (через параметр b). Принимая во внимание этот факт, вы можете подтвердить сделанный вызов a.

...