简体   繁体   English

Android 数据绑定 MockK:每个 {} 块内缺少调用

[英]Android data binding MockK: Missing calls inside every { } block

I am using MockK for unit tests.我正在使用 MockK 进行单元测试。 When I try to mock data binding class generated for my layout I'm getting strange error.当我尝试模拟为我的布局生成的数据绑定 class 时,出现了奇怪的错误。 I want to mock one of the views inside the layout the data binding class wraps using我想模拟布局内的视图之一数据绑定 class 包装使用

every { binding.someView } returns mockedView

but I'm getting但我越来越

io.mockk.MockKException: Missing calls inside every {... } block. io.mockk.MockKException:每个 {...} 块内缺少调用。

When I try the same with binding variable defined in <data> block of the layout everything works as expected.当我尝试对布局的<data>块中定义的绑定变量进行相同操作时,一切都按预期工作。 But views don't.但是观点没有。

Am I missing something?我错过了什么吗?

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 }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM