可以模拟/测试Android ViewBinding交互吗?

可以模拟/测试Android ViewBinding交互吗?,android,unit-testing,android-viewbinding,Android,Unit Testing,Android Viewbinding,目前正在尝试在单元测试中测试与类的交互 "Invalid Input" should { "disable the LoginButton" { val viewBinding: FrLoginBinding = mockk() InvalidInputViewStateBinder.bind(InvalidInput, viewBinding) verify { viewBinding.loginButton.isEnabled =

目前正在尝试在单元测试中测试与类的交互

"Invalid Input" should {
    "disable the LoginButton" {
        val viewBinding: FrLoginBinding = mockk()

        InvalidInputViewStateBinder.bind(InvalidInput, viewBinding)

        verify { viewBinding.loginButton.isEnabled = false }
    }
}
我就是这么想的。ViewBinding中的视图是公共最终属性,不容易模拟。至少我不能。传递一个
View
mock来创建ViewBinding也不起作用,因为我必须为它模拟
findviewbyd


有没有人尝试过这个方法并使其发挥作用?

我遇到了同样的问题。下面是我如何解决的


@RunWith(PowerMockRunner::class)
@PrepareForTest(MyLayoutBinding::class)
class MyTestClass {

    @Mock
    lateinit var mMockViewBinding: MyLayoutBinding

    @Mock
    lateinit var mMockView: View

    @Mock
    lateinit var mMockTitleTv: TextView

    @Mock
    lateinit var mMockRootView: ConstraintLayout

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        PowerMockito.mockStatic(MyLayoutBinding::class.java)
        whenever(MyLayoutBinding.bind(mMockView)).thenReturn(mMockViewBinding)
        
        // Use Whitebox for each view component in the layout.
        Whitebox.setInternalState(mMockBinding, "title", mMockTitleTv)
        
        // Because 'getRoot' is part of the ViewBinding interface, we just mock the method.
        whenever(mMockBinding.root).thenReturn(mMockRootView)
    }


}

使用Whitebox设置属性(即按id设置视图),并模拟getRoot()接口方法将根设置为模拟的根视图。

找到解决方法了吗?还没有,将进行更多挖掘soon@mochadwi,我在下面添加了一个实现细节,说明您需要如何模拟模拟模拟viewbinding的部分。但是,在验证之前,您需要检查mocked viewbinding的访问权限。因此,对于LayoutBinding的每个视图,我需要提供一个mock并使用Whitebox设置内部状态?即使没有断言?@FloWe您也应该能够模拟特定视图并使用whitebox进行设置。