私が直面している問題は、Matchers.anyObject()
がnull
を返すことです。 null不可の型のみを受け入れるモックメソッドに使用すると、「nullではない」例外がスローされます。
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
模擬方法:
public open fun login(userCredentials: UserCredentials): Response
次の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 { ... }
}
このトピックの 詳細な議論 があり、回避策が最初に提案されています。
入力する必要がある人向けany(type: Class<T>)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
これは機能し、型チェックも行われます!
次のヘルパー関数を使用して、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 を参照してください。
verify
を頻繁に使用して、関数に渡されるパラメーターも正しいことを確認します。
これを行い、NPEを回避するには、kotlinのelvis演算子を使用できます。例:verify(mock).func(same(my_obj) ?: my_obj)
このように、mockitoは実際に変数を検証するために満たされ、kotlinはnull以外のオブジェクトを渡すために満たされます。
私がつまずいたのは、この問題を正確に解決するmockito-kotlinライブラリでした https://github.com/nhaarman/mockito-kotlin