Использование mockk для соответствия любым varargs - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь смоделировать контекст Android, чтобы вернуть строку из идентификатора ресурса.Однако у меня проблемы с сопоставлением заглушки с вызовом, я полагаю, что это из-за varargs.Тем не менее, я новичок в mockk, поэтому я могу просто пропустить что-то очень простое.

Я высмеиваю контекст следующим образом:

val context = mockk<Context>()
every { context.getString(any(), any()) } returns stringToReturn

Но при вызове getString для объекта он выдает следующее исключение:

io.mockk.MockKException: no answer found for: Context(#1).getString(2131689544, [])

Если это важно, я вызываю функцию в тестируемом классе следующим образом.formatArgs может быть пустым, но не должен:

protected fun foo(stringResource: Int, vararg formatArgs: Any) {
    val s = context.getString(errorMessageStringResource, *formatArgs)

Есть идеи, как я могу это исправить?

Вы можете проверить проект и воспроизвести исключение здесь: Github Project

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

В версии 1.9.1 добавлено несколько дополнительных сопоставителей для сопоставления с переменными.

https://mockk.io/#varargs

0 голосов
/ 24 января 2019

В mockk v1.9 имеется соответствующая открытая проблема: https://github.com/mockk/mockk/issues/224 (см. Также упомянутые проблемы)

Я попробовал несколько решений, но в итоге я создал перегруженные функции только для тестирования с mockk , например.

class Context {
    // Renamed because of same JVM signature
    fun foo2(stringResource: Int, vararg formatArgs: Any) = foo(stringResource, formatArgs)

    // Function accepts 
    fun foo(stringResource: Int, formatArgs: args: Array<out Any>) = ...
}

, затем протестируйте функцию non-vararg foo() с помощью mockk .

Я знаю, что это уродливый обходной путь, но если вы найдете лучший вариант, пожалуйста, дайте мне знать:)

...