在Kotlin中可以使用Mockito吗?
我面临的问题是Matchers.anyObject()
返回null
。 当用于模拟只接受不可为空的types的方法时,会导致抛出“不应为空”的exception。
`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse }
嘲笑方法:
public open fun login(userCredentials: UserCredentials): Response
有两种可能的解决方法:
private fun anyObject(): T { Mockito.anyObject () return uninitialized() } private fun uninitialized(): T = null as T @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } }
另一个解决方法是
private fun anyObject(): T { return Mockito.anyObject () } @Test fun myTest() { `when`(mockedBackend).login(anyObject())).thenAnswer { ... } }
以下是有关此主题的更多讨论 ,其中首先提出了解决方法。
我使用verify
很多来确保传递给函数的参数也是正确的。
要做到这一点,仍然避免NPE,你可以使用KOTLIN的猫王操作。 例如: verify(mock).func(same(my_obj) ?: my_obj)
这样,mockito是满意的,因为它实际上validationvariables,并且kotlin是满意的,因为我们传递一个非null对象。
另外一个我偶然发现的问题就是解决这个问题的mockito-kotlin库。https ://github.com/nhaarman/mockito-kotlin
你可以使用下面的辅助函数在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 eq(obj: T): T = Mockito.eq (obj) /** * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when * null is returned. */ fun any(): T = Mockito.any () /** * Returns ArgumentCaptor.capture() as nullable type to avoid java.lang.IllegalStateException * when null is returned. */ fun capture(argumentCaptor: ArgumentCaptor ): T = argumentCaptor.capture()
请参阅Google的Android Architecture Blueprints存储库中的MockitoKotlinHelpers.kt 。