Is it possible to use Mockito in Kotlin?
There are two possible workarounds:
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 { ... }
}
The other workaround is
private fun <T> anyObject(): T {
return Mockito.anyObject<T>()
}
@Test
fun myTest() {
`when`(mockedBackend).login(anyObject())).thenAnswer { ... }
}
Here is some more discussion on this topic, where the workaround is first suggested.
For those who need typed any(type: Class<T>)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
This would work and the type check also happens!
You can use the following helper functions to use Mockito's any(), eq() and capture() matchers in 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()
See MockitoKotlinHelpers.kt from the Android Architecture Blueprints repository by Google.
I use verify
a lot to make sure the parameters passed to a function are also correct.
To do this, and still avoid the NPE you can use kotlin's elvis operator.
for example:
verify(mock).func(same(my_obj) ?: my_obj)
This way, mockito is satisfied because it actually verifies the variable, and kotlin is satisfied because we pass a non null object.
Another thing I stumbled upon was the mockito-kotlin library which solves exactly this issue https://github.com/nhaarman/mockito-kotlin