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

이를 위해 NPE를 피하려면 kotlin의 elvis 연산자를 사용할 수 있습니다. 예를 들면 :
verify(mock).func(same(my_obj) ?: my_obj)

이런 식으로 mockito는 실제로 변수를 확인하기 때문에 만족되고 kotlin은 null이 아닌 객체를 전달하기 때문에 만족됩니다.

내가 우연히 발견 한 또 다른 것은이 문제를 정확히 해결하는 mockito-kotlin 라이브러리입니다.
https://github.com/nhaarman/mockito-kotlin


답변

사용할 때 null이 아닌 결과를 반환하면됩니다 Mockito.any().

Mockito.any() ?: 0
Mockito.any() ?: HashMap<Int,Int>()
Mockito.any() ?: {}


답변

@makovkastar에서 제공하는 답변을 확장하려면 다음과 같이 nullable 또는 non-nullable Matcher를 제공 할 수 있습니다.

/**
 * Matcher that returns null
 */
private inline fun <reified T> any(): T = Mockito.any<T>()

/**
 * Matcher never returns null
 */
private inline fun <reified T> any(type: Class<T>): T = Mockito.any(type)


답변