Модульное тестирование пользовательского DiffUtil.Callback - PullRequest
0 голосов
/ 17 октября 2018

Вот мой 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...