Как создать Mockito mock с параметрами конструктора в Kotlin? - PullRequest
1 голос
/ 16 апреля 2019

Я бы хотел использовать doReturn(sth).when(underTest).someFunc() вместо when(underTest.someFunc()).thenReturn(sth).
(на самом деле ничего не нужно выполнять внутри someFunc() - https://stackoverflow.com/a/29394497/541624)

На Java я мог бы сделать underTest = Mockito.spy(new SomeClass(someParam));

Я получаю:

Mockito cannot mock/spy because :
 - final class

1 Ответ

0 голосов
/ 16 апреля 2019

Причина, по которой вы не можете издеваться / шпионить за классами 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/, у которой нет этой проблемы.

Сказав все вышесказанное, я предлагаю подумать, не могли бы вы использовать здесь интерфейсный / абстрактный класс, а не конкретный класс.Это лучший способ абстрагироваться от зависимости с помощью насмешек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...