Вот мой DiffUtil.Callback
class IdentifiableComponentDiffUtil(
private val oldComponents: List<Component>,
private val newComponents: List<Component>
) : DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldViewType = oldComponents[oldItemPosition].viewType
val newViewType = newComponents[newItemPosition].viewType
val oldModel = oldComponents[oldItemPosition].model
val newModel = newComponents[newItemPosition].model
return if (oldViewType == newViewType) {
when {
oldModel is DiffUtilIdentifiable -> oldModel.isSameItem(newModel)
newModel is DiffUtilIdentifiable -> newModel.isSameItem(oldModel)
else -> false
} else {
false
}
}
override fun getOldListSize(): Int {
return oldComponents.size
}
override fun getNewListSize(): Int {
return newComponents.size
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldComponents[oldItemPosition].model == newComponents[newItemPosition].model
}
}
А вот мой тест
@RunWith(MockitoJUnitRunner::class)
class DiffUtilsTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var component1: Component
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var component2: Component
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var component3: Component
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var component4: Component
@Mock private lateinit var diffUtilIdentifiableVoicemailModel1: DiffUtilIdentifiableVoicemailModel
@Mock private lateinit var diffUtilIdentifiableVoicemailModel2: DiffUtilIdentifiableVoicemailModel
@Mock private lateinit var diffUtilIdentifiableVoicemailModel3: DiffUtilIdentifiableVoicemailModel
@Mock private lateinit var diffUtilIdentifiableVoicemailModel4: DiffUtilIdentifiableVoicemailModel
@Test
fun `GIVEN two component lists with differences WHEN IdentifiableComponentDiffUtil-Callback invoked THEN DiffUtil-Callback areItemsTheSame is correctly calculated`() {
val oldComponents = listOf(component1, component2)
val newComponents = listOf(component3, component4)
whenever(component1.model).thenReturn(diffUtilIdentifiableVoicemailModel1)
whenever(component2.model).thenReturn(diffUtilIdentifiableVoicemailModel2)
whenever(component3.model).thenReturn(diffUtilIdentifiableVoicemailModel3)
whenever(component4.model).thenReturn(diffUtilIdentifiableVoicemailModel4)
lenient().`when`(diffUtilIdentifiableVoicemailModel1.id).thenReturn("1")
lenient().`when`(diffUtilIdentifiableVoicemailModel2.id).thenReturn("2")
lenient().`when`(diffUtilIdentifiableVoicemailModel3.id).thenReturn("3")
lenient().`when`(diffUtilIdentifiableVoicemailModel4.id).thenReturn("4")
val resultCaptor1 = ResultCaptor<Boolean>()
val resultCaptor2 = ResultCaptor<Boolean>()
val resultCaptor3 = ResultCaptor<Boolean>()
val resultCaptor4 = ResultCaptor<Boolean>()
val diffUtilCallback = spy(IdentifiableComponentDiffUtil(oldComponents, newComponents))
doAnswer(resultCaptor1).`when`(diffUtilCallback).areItemsTheSame(0,0)
doAnswer(resultCaptor2).`when`(diffUtilCallback).areItemsTheSame(1,0)
doAnswer(resultCaptor3).`when`(diffUtilCallback).areItemsTheSame(0,1)
doAnswer(resultCaptor4).`when`(diffUtilCallback).areItemsTheSame(1,1)
DiffUtil.calculateDiff(diffUtilCallback)
assertEquals(false, resultCaptor1.result)
assertEquals(false, resultCaptor2.result)
assertEquals(false, resultCaptor3.result)
assertEquals(false, resultCaptor4.result)
}
}
Я хочу получить утверждения о методах areItemsTheSame (i, j)вызывается в DiffUtil.Callback.Однако я не могу напрямую проверить эти утверждения, потому что у меня нет метода DiffUtil.calculateDiff ().Поэтому мое решение состоит в том, чтобы шпионить за DiffUtil.Callback и использовать resultCapture для проверки того, что методы areItemsTheSame (i, j) были вызваны и вернули правильный результат.
Однако мне советуют шпионить за классомтестируемый должен использоваться только экономно и только для определенных ситуаций.У меня вопрос: это правильная ситуация для использования шпионов или есть ли лучший способ проверить этот DiffUtil.Callback?