'Android data binding MockK: Missing calls inside every { } block

I am using MockK for unit tests. When I try to mock data binding class generated for my layout I'm getting strange error. I want to mock one of the views inside the layout the data binding class wraps using

every { binding.someView } returns mockedView

but I'm getting

io.mockk.MockKException: Missing calls inside every { ... } block.

When I try the same with binding variable defined in <data> block of the layout everything works as expected. But views don't.

Am I missing something?



Solution 1:[1]

I know it's been a while since the question was posted, but I seem to have found a way to do this.

import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import com.example.R
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
import io.mockk.unmockkAll
import io.mockk.verify
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

@ExtendWith(MockKExtension::class)
internal class BindingMockkExample {

    private lateinit var binding: MyBinding

    @MockK(relaxed = true)
    private lateinit var rootView: ConstraintLayout

    @MockK(relaxed = true)
    private lateinit var textView: TextView

    @MockK(relaxed = true)
    private lateinit var imageView: AppCompatImageView

    @BeforeEach
    fun beforeEach() {
        every { rootView.findViewById<AppCompatImageView>(R.id.my_image_view) } returns imageView
        every { rootView.findViewById<TextView>(R.id.my_text_view) } returns textView
        binding = MyBinding.bind(rootView)
    }

    @AfterEach
    fun afterEach() {
        unmockkAll()
    }

    @Test
    fun `GIVEN something WHEN something happens THEN imageView becomes invisible`() {
        // do something that should make image invisible
        
        verify { imageView.isVisible = false }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ????? ????????