2015-05-18 19 views
25

Problem, przed którym stoję, polega na tym, że Matchers.anyObject() zwraca null. W przypadku użycia do udawania metody, która akceptuje tylko typy nieululowalne, wywołuje wyjątek "Nie powinien być zerowy".Czy można używać Mockito w Kotlin?

`when`(mockedBackend.login(anyObject())).thenAnswer { invocationOnMock -> someResponse } 

szydzili metoda:

public open fun login(userCredentials: UserCredentials): Response 
+1

Istnieje dyskusja na stronie społeczności kotlin, jak uniknąć tego problemu, sprawdź to: https://devnet.jetbrains.com/thread/443551 – SimY4

+0

Dziękuję. Wygląda na to, że devnet.jetbrains.com nie jest dobrze indeksowany przez google. – atok

Odpowiedz

31

Istnieją dwa możliwe obejścia:

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 { ... } 
} 

Drugi obejście jest

private fun <T> anyObject(): T { 
    return Mockito.anyObject<T>() 
} 

@Test 
fun myTest() { 
    `when`(mockedBackend).login(anyObject())).thenAnswer { ... } 
} 

Oto some more discussion na ten temat, gdzie worka runda jest najpierw sugerowana.

+5

Wierzę, że SO uprzejmie prosi, abyś zreplikował treść linku w swojej odpowiedzi, tak, że jeśli link kiedykolwiek umrze, ta odpowiedź jest nadal przydatna. –

+0

Niestety, w wersji 1.0.0-beta-4584 obejście tego problemu już nie działa: 'kotlin.TypeCastException: null nie może być rzutowany na non-null typu X'. – nhaarman

+0

@nhaarman działa idealnie dla mnie, czy mógłbyś wskazać mi dokładnie przypadek? –

7

Często używam verify, aby upewnić się, że parametry przekazane do funkcji są również poprawne.

Aby to zrobić, i nadal unikaj NPE, możesz użyć operatora kotlin's elvis. na przykład: verify(mock).func(same(my_obj) ?: my_obj)

ten sposób Mockito jest zadowolony, ponieważ faktycznie sprawdza zmienną i Kotlin jest zadowolony, bo mijamy non obiekt zerowy.

Inną rzeczą, którą natknął się biblioteka Mockito-Kotlin który rozwiązuje dokładnie tej kwestii https://github.com/nhaarman/mockito-kotlin

2

można użyć następujących funkcji pomocniczych w użyciu Mockito jakaś(), eq() i przechwytywania() dopasowujące w 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() 

Zobacz MockitoKotlinHelpers.kt z repozytorium Android architekturze plany przez Google.

2

Dla tych, którzy potrzebują wpisane any(type: Class<T>)

private fun <T> any(type: Class<T>): T = Mockito.any<T>(type) 

to będzie działać, a także sprawdzić typ dzieje!