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

时间:2020-04-01 07:52:33

标签: android unit-testing android-viewbinding

当前尝试在单元测试中测试与ViewBinding类的交互作用

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

        InvalidInputViewStateBinder.bind(InvalidInput, viewBinding)

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

我想到的就是这样。 ViewBinding中的View是公共的最终属性,无法轻松模拟。至少我做不到。传递View模拟来创建ViewBinding也行不通,因为我必须为其模拟findViewById

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

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。这是我的解决方法


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

相关问题