在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 。