Использование mockk для соответствия любым varargs
Я пытаюсь смоделировать контекст Android, чтобы вернуть строку из идентификатора ресурса. Однако у меня проблемы с сопоставлением заглушки с вызовом, я полагаю, что это из-за varargs. Тем не менее, я новичок в макете, поэтому я могу просто пропустить что-то очень легко.
Я высмеиваю контекст следующим образом:
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 ответа
В версии 1.9.1 добавлено несколько дополнительных средств сравнения для соответствия varargs.
В 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>) = ...
}
тогда проверь не вараг foo()
функция с макетом.
Я знаю, что это уродливый обходной путь, но если вы найдете лучший вариант, пожалуйста, дайте мне знать:)