programing tip

Kotlin에서 Mockito를 사용할 수 있습니까?

itbloger 2020. 12. 12. 10:12
반응형

Kotlin에서 Mockito를 사용할 수 있습니까?


내가 직면 한 문제는 Matchers.anyObject()반환 null입니다. nullable이 아닌 형식 만 허용하는 모의 메서드에 사용하면 "Should not be null"예외가 throw됩니다.

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

모의 방법 :

public open fun login(userCredentials: UserCredentials): Response

두 가지 가능한 해결 방법이 있습니다.

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

다음은 이 주제에 대한 몇 가지 추가 논의 이며, 여기서 해결 방법이 먼저 제안됩니다.


타이핑이 필요한 사람들을 위해 any(type: Class<T>)

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

이것은 작동하고 유형 검사도 발생합니다!


다음 도우미 함수를 사용하여 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함수에 전달 된 매개 변수도 올바른지 확인하기 위해 많이 사용 합니다.

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

참고URL : https://stackoverflow.com/questions/30305217/is-it-possible-to-use-mockito-in-kotlin

반응형