테스트 및 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] 삭제
몇 마디 만하겠습니다