web-dev-qa-db-ja.com

KotlinでMockitoを使用することは可能ですか?

私が直面している問題は、Matchers.anyObject()nullを返すことです。 null不可の型のみを受け入れるモックメソッドに使用すると、「nullではない」例外がスローされます。

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

模擬方法:

public open fun login(userCredentials: UserCredentials): Response
57
atok

次の2つの回避策があります。

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 { ... }
}

このトピックの 詳細な議論 があり、回避策が最初に提案されています。

58
Sergey Mashkov

入力する必要がある人向けany(type: Class<T>)

    private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)

これは機能し、型チェックも行われます!

19
Shamm

次のヘルパー関数を使用して、KotlinでMockitoのany()、eq()およびcapture()マッチャーを使用できます。

/**
 * 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()

GoogleのAndroid Architecture Blueprintsリポジトリの MockitoKotlinHelpers.kt を参照してください。

12
makovkastar

verifyを頻繁に使用して、関数に渡されるパラメーターも正しいことを確認します。

これを行い、NPEを回避するには、kotlinのelvis演算子を使用できます。例:verify(mock).func(same(my_obj) ?: my_obj)

このように、mockitoは実際に変数を検証するために満たされ、kotlinはnull以外のオブジェクトを渡すために満たされます。

私がつまずいたのは、この問題を正確に解決するmockito-kotlinライブラリでした https://github.com/nhaarman/mockito-kotlin

9
maxandron