我面临的问题是Matchers.anyObject()
回报null
。当用于仅接受非空类型的模拟方法时,它将导致引发“应该不为空”异常。
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
模拟方法:
public open fun login(userCredentials: UserCredentials): Response
我面临的问题是Matchers.anyObject()
回报null
。当用于仅接受非空类型的模拟方法时,它将导致引发“应该不为空”异常。
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
模拟方法:
public open fun login(userCredentials: UserCredentials): Response
Answers:
有两种可能的解决方法:
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 { ... }
}
这是有关此主题的更多讨论,其中首先提出了解决方法。
kotlin.TypeCastException: null cannot be cast to non-null type X
。
您可以使用以下帮助器函数在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得到了满足,而由于传递了非null对象,因此使kotlin得到了满足。
我偶然发现的另一件事是模仿Mockito-kotlin库,它完全解决了这个问题 https://github.com/nhaarman/mockito-kotlin