Причина, по которой вы не можете издеваться / шпионить за классами Kotlin, заключается в том, что они являются окончательными (по умолчанию).Таким образом, Mockito не может издеваться над такими классами, если вы не введете ключевое слово open
.
В версии 2 Mockito появилась функция, которая позволяет вам издеваться над последними классами.
Как это сделать?Добавьте mockito-inline
зависимость с другими зависимостями mockito v2.Например: testImplementation 'org.mockito:mockito-inline:2.8.9'
Затем используйте методы mockito как обычно.
Вот фиктивный тест, который демонстрирует, как смоделировать метод и ничего не делать.
class Foo {
var xval = 0
fun foo(x: Int, y: Int): Int = x / y
fun bar(x: Int) {
xval = x
}
}
class FooTest {
@Test
fun fooTest() {
val foo = Mockito.mock(Foo::class.java)
Mockito.doAnswer(Answers.RETURNS_DEFAULTS).`when`(foo).foo(10, 2)
assertEquals(0, foo.foo(10, 2))
Mockito.doNothing().`when`(foo).bar(100)
assertEquals(0, foo.xval)
}
}
Каквы можете видеть, что вы можете вернуть значения по умолчанию для методов, которые возвращают что-то или ничего не делают для методов void.
В противном случае вы можете использовать библиотеку mockk
https://mockk.io/, у которой нет этой проблемы.
Сказав все вышесказанное, я предлагаю подумать, не могли бы вы использовать здесь интерфейсный / абстрактный класс, а не конкретный класс.Это лучший способ абстрагироваться от зависимости с помощью насмешек.