Можно ли использовать Mockito в Котлине?

Проблема, с которой я сталкиваюсь, заключается в том, что Matchers.anyObject() возвращает null . Когда используется для издевательства метода, который принимает только типы, не допускающие null, он вызывает исключение «Не должно быть null».

 `when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse } 

Изделенный метод:

 public open fun login(userCredentials: UserCredentials): Response 

    Возможны два способа обхода:

     private fun <T> anyObject(): T { Mockito.anyObject<T>() return uninitialized() } private fun <T> uninitialized(): T = null as T @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } } 

    Другим обходным решением является

     private fun <T> anyObject(): T { return Mockito.anyObject<T>() } @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } } 

    Вот еще несколько обсуждений по этой теме, где сначала предлагается обходное решение.

    Я использую verify чтобы убедиться, что параметры, переданные функции, также верны.

    Чтобы сделать это, и по-прежнему избегать NPE, вы можете использовать оператор elvis kotlin. например: verify(mock).func(same(my_obj) ?: my_obj)

    Таким образом, mockito удовлетворен, потому что он фактически проверяет переменную, а kotlin выполняется, потому что мы передаем непустой объект.

    Еще одна вещь, на которую я наткнулся, была библиотека mockito-kotlin, которая решает именно эту проблему. https://github.com/nhaarman/mockito-kotlin

    Вы можете использовать следующие вспомогательные функции для использования Mockito в любых (), eq () и capture () в Kotlin:

     /** * Returns Mockito.eq() as nullable type to avoid java.lang.IllegalStateException when * null is returned. * * Generic T is nullable because implicitly bounded by Any?. */ fun <T> eq(obj: T): T = Mockito.eq<T>(obj) /** * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when * null is returned. */ fun <T> any(): T = Mockito.any<T>() /** * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException * when null is returned. */ fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture() 

    См. MockitoKotlinHelpers.kt из хранилища Google Архитектуры Android Blueprints от Google.