有这样一个测试。
@Test
fun needShowOnboarding() {
val cards = listOf(
mockCard(cardUcid = "1", pinSet = false),
mockCard(cardUcid = "2", pinSet = true),
mockCard(cardUcid = "3", pinSet = true)
)
val account = mockBankAccount(cards)
val testObserver = pinSetCardCheker.getOnboardingShowingMode(listOf(account)).test()
with(testObserver) {
assertNoErrors()
assertValueCount(1)
assertResult(PinSetOnboardingShowingMode.Single("1"))
}
}
其实这样的对象应该是返回PinSetOnboardingShowingMode.Single("1")了才返回的,只是测试不断地crash,报错:
java.lang.AssertionError: Values at position 0 differ; expected: ...PinSetOnboardingShowingMode$Single@5ec77191 (class: Single) but was: ...PinSetOnboardingShowingMode$Single@4642b71d (class: Single) (latch = 0, values = 1, errors = 0, completions = 1)
Expected :...PinSetOnboardingShowingMode$Single@5ec77191 (class: Single)
Actual :...PinSetOnboardingShowingMode$Single@4642b71d (class: Single) (latch = 0, values = 1, errors = 0, completions = 1)
如果我们打开比较对象之间的差异,我们会看到以下内容:
...PinSetOnboardingShowingMode$Single@5ec77191 (class: Single)...PinSetOnboardingShowingMode$Single@4642b71d (class: Single) (latch = 0, values = 1, errors = 0, completions = 1)
这对我来说仍然是一个谜,它在结果对象中的位置:
“(闩锁= 0,值= 1,错误= 0,完成= 1)”。
这是PinSetOnboardingShowingMode类本身:
sealed class PinSetOnboardingShowingMode {
object None : PinSetOnboardingShowingMode()
class Single(val cardUcid: String) : PinSetOnboardingShowingMode()
class List(val cardUcidsWithoutPin: ArrayList<String>) : PinSetOnboardingShowingMode()
}
只要getOnboardingShowingMode返回相同的方法 ( ) boolean,PinSetOnboardingShowingMode测试就成功了。
assertResult 方法比较对象,通过测试结果中的哈希码判断,它们是不同的。发生这种情况是因为在密封类 PinSetOnboardingShowingMode 中,您使用的是常规类而不是数据类,该类自动覆盖了 equals 和 hashcode 方法。要么用 Single 覆盖它们,要么使用数据类。