我有這些密封介面
sealed interface Result<out T> {
data class Success<T>(val data: T) : Result<T>
data class Error(val exception: Throwable? = null) : Result<Nothing>
}
當我嘗試assertEquals
成功時,它通過了。但是當涉及到錯誤一時,即使內容相同,它也會失敗。這是一個簡單的例子:
@Test
fun testSucess() = runTest {
whenever(repository.login("email", "password"))
.thenReturn(someValue)
val expected = Result.Success(data = someValue)
val actual = loginUseCase(LoginRequest("email", "password"))
verify(repository).login("email", "password")
assertEquals(expected, actual) // this will pass
}
@Test
fun testError() = runTest {
val exception = RuntimeException("HTTP Error")
whenever(repository.login("", ""))
.thenThrow(exception)
val expected = Result.Error(exception = exception)
val actual = loginUseCase(LoginRequest("", ""))
verify(repository).login("", "")
assertEquals(expected, actual) // this will fail
assertEquals(expected.toString(), actual.toString()) // this will pass
}
是什么原因造成的,有什么可能的解決方案?我已經閱讀了一些需要equals()
覆寫它的資訊,但我仍然對為什么它只在錯誤情況下發生以及如何正確覆寫 equals 方法感到困惑。
uj5u.com熱心網友回復:
Kotlin 中的資料類equals
有一個從其所有屬性自動派生的隱式生成函式。
您面臨的問題可能是由于您的型別someValue
具有適當的equals
功能,因此 equals 適用于您Success
及其屬性value
。但是Throwable
沒有一個equals
函式,這意味著兩個Throwable
s 只有當它們是相同的實體時才相等,這顯然不是你的測驗斷言的expected
情況actual
。我只能猜測,loginUseCase
例外被包裝在另一個例外中,還是基于存盤庫拋出的例外創建了一個新例外?
Kotlin 已經有一個內置Result
型別,我強烈建議使用它而不是定義你自己的。
盡管如此,如果您使用內置型別,您可能會遇到同樣的問題,因為equals
對于不同的例外實體,檢查仍然失敗。
有幾種方法可以解決這個問題:
- 定義您自己的例外型別并覆寫 equals 函式以在它們都是相同型別且具有相同訊息的情況下回傳 true。
- 檢查
expected is Error
(或使用默認Result
型別 thatexpected.isFailure
),然后檢查訊息是否相同。 - 確保
loginUseCase
拋出與存盤庫拋出的完全相同的例外實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494600.html