Mockito의 `thenReturn`은 테스트된 클래스에서 호출할 때 직접적으로가 아니라 Pair(null."text") 대신 `null`을 반환합니다.

스타치

테스트 및 Mockito 초보자는 여기에 있으므로 간단한 오류가 있기를 바랍니다.
편집 기능이 suspend기능 이기 때문일 가능성이 큽니다.

내 테스트는 nullable이 아닌 반환해야 하는 곳에서 Mockito반환 null되기 때문에 충돌 합니다 Pair. 라이브 환경에서 이 코드는 잘 작동하지만(NPE 없음) Mockito로 테스트를 통과할 수 없습니다.
곤란한 조롱:

val mks = mock(MyKeyStore::class.java)
`when`(mks.createKeyStore(user,pass)).thenReturn(Pair(null, "userExists"))

MyKeyStore.createKeyStore() nullable이 아닌 반환 Pair

suspend fun createKeyStore(user: String, ksPass: String): Pair<KeyStore?, String>

mks.createKeyStore()UserRepo.createUser()
테스트 ksResult == null가 정의에 의해 nullable이 아닌 것으로 간주하기 때문에 UserRepo에 의해 충돌이 발생합니다 . nullable로 변경하면 코드가 전혀 컴파일되지 않으므로 Mockito 설정과 관련이 있다고 생각합니다.

class UserRepo(private val myKeyStore: MyKeyStore) {
    suspend fun createUser(user: String, p0: String, p1: String): Pair<Boolean, String> =
        withContext(Dispatchers.IO) {
            return@withContext if (p0 == p1) {
                val ksResult = myKeyStore.createKeyStore(user, p0)
                ksResult.first?.let { //line where NPE crash leads
                    val keyResult = myKeyStore.createKeyDB(user, p0)
                    keyResult.first?.let { Pair(true, keyResult.second) } ?: run { Pair(false, keyResult.second) }
                } ?: run { Pair(false, ksResult.second) }
            } else Pair(false, myKeyStore.mPasswordsNotMatching)
        }
}

전체 테스트

    @Test
    fun createUserFailDueToUserExisting() = runBlocking() {
        val user = "user"
        val pass = "pass"
        val mks = mock(MyKeyStore::class.java)
        `when`(mks.createKeyStore(user,pass)).thenReturn(Pair(null, "userExists"))
        println(mks.createKeyStore(user,pass)) // this actually prints the pair correctly
        val repo = UserRepo(mks)
        val result = repo.createUser(user,pass,pass) // NPE crash, but why?
        assertFalse(result.first)
        assertTrue(result.second == "userExists")
    }

Pair대신 반환하도록 모의를 구성하려면 어떻게 null해야 합니까?

스타치

함수가 suspend함수 이기 때문입니다. 디스패처를 runBlocking지정
하면 답을 찾았 습니다. Android에서 코루틴 테스트

    @Test
    fun createUserFailDueToUserExisting() = runBlocking(Dispatchers.IO) {
        val user = "user"
        val pass = "pass"
        val mks = mock(MyKeyStore::class.java)
        `when`(mks.createKeyStore(user, pass)).thenReturn(Pair(null, "userExists"))
        println(mks.createKeyStore(user, pass))
        val repo = UserRepo(mks)
        val result = repo.createUser(user, pass, pass)
        assertFalse(result.first)
        assertTrue(result.second == "userExists")
    }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관