能否模拟/测试 Android ViewBinding 的交互?

5

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

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

        InvalidInputViewStateBinder.bind(InvalidInput, viewBinding)

        verify { viewBinding.loginButton.isEnabled = false }
    }
}

我想的是这样的东西。ViewBinding 中的 Views 是公共的 final 属性,不容易进行模拟。至少我无法做到。将一个 View 模拟传递给 create ViewBinding 也不起作用,因为我必须对其进行模拟 findViewById

有人尝试过这个并使其正常工作吗?


你找到解决方法了吗? - mochadwi
暂时还没有,我会尽快深入挖掘。 - Flo We
1
@mochadwi,我为下面模拟的视图绑定添加了实现细节,但在验证之前,您需要访问模拟的视图绑定。 - Glo
1个回答

4

我遇到了同样的问题。这是我如何解决它的:


@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()`接口方法将根设置为您的模拟根视图。

那么对于每个 LayoutBinding 的视图,我需要提供一个模拟对象并使用 Whitebox 设置其内部状态吗?即使我没有对它们进行任何断言? - Flo We
@FloWe 你应该可以使用whitebox来模拟特定视图并设置它。 - Glo
根据您提供的片段,您是指 mMockBinding.root 还是 mMockViewBinding.root - Ankush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接