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


82

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

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

모의 방법 :

public open fun login(userCredentials: UserCredentials): Response

2
이 문제를 피하는 방법에 대한 kotlin 커뮤니티 사이트에 대한 토론이 있습니다. devnet.jetbrains.com/thread/443551
SimY4

1
감사합니다. devnet.jetbrains.com이 Google에 의해 잘 색인되지 않은 것 같습니다.
atok

답변:


77

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

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

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


6
나는 당신이 대답에 링크의 내용을 복제하도록 친절하게 요청한다고 믿습니다. 그러면 링크가 죽 더라도이 대답은 여전히 ​​유용합니다.
Greg Kopff

1
안타깝게도 1.0.0-beta-4584에서는이 해결 방법이 더 이상 작동하지 않는 것 같습니다 kotlin.TypeCastException: null cannot be cast to non-null type X..
nhaarman

@nhaarman은 저에게 완벽하게 작동합니다. 정확한 경우를 알려주시겠습니까?
Sergey Mashkov 2015

3
Kotlin 1.2.40에서 작동하지 않습니다. 다른 해결 방법이 없습니까?
Amir Ziarati

@nhaarman Kotlin 1.3.11, Mockito 2.7.12, Kotlin Mockito 1.5.0, 2019 년 1 월 : 해결 방법 1 ... 음, 작동합니다. 내 사용 사례는 given / when 절 내에 있습니다.
milosmns

43

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

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

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


6
지나가는 방지 할 수있다 클래스 이름 :: class.java을 구체화 인수를 사용하여 인수 :inline fun <reified T> anyNonNull(): T = Mockito.any<T>(T::class.java)
탈레스 푸포 아라 우호

28

다음 도우미 함수를 사용하여 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 를 참조하십시오 .


2
URL이 다음으로 이동 한 것 같습니다. github.com/googlesamples/android-architecture/blob/…
Surekha

감사합니다! 최신 버전의 Mockito (v3.3.3) 및 Kotlin (v1.3.72)에서도 작동합니다
Fatmajk

10

verify함수에 전달 된 매개 변수도 올바른지 확인하기 위해 많이 사용 합니다.

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

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

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


2

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

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

...


0

@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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.