Espresso launchFragmentInContainer<>测试Fragment时View Binding绑定异常问题
你遇到的这个问题根本不是View Binding本身的问题,而是launchFragmentInContainer默认使用的主题缺少View Binding inflate时需要的属性导致的。完全没必要专门写一个不带View Binding的测试Fragment,只需要给测试的Fragment指定正确的主题就能解决。
问题原因
launchFragmentInContainer在默认情况下会使用一个极简的空主题,而你的Fragment布局里大概率用到了依赖App主题定义的属性(比如?attr/colorPrimary这类主题引用属性)。当View Binding尝试解析布局时,找不到这些属性的定义,就会抛出Failed to resolve attribute的错误。
快速解决方案
在调用launchFragmentInContainer时,直接指定你App的主题资源ID即可:
@Test fun testfunc() { val fragScenario = launchFragmentInContainer<MyFragment>( themeResId = R.style.Theme_YourAppName // 替换成你项目里实际的App主题 ) }
这里的Theme_YourAppName就是你在AndroidManifest.xml里给Application节点设置的主题,一般在res/values/styles.xml中定义。
全局配置(可选)
如果你的所有Fragment测试都需要用到同一个主题,也可以在测试类上通过注解统一配置,比如:
@RunWith(AndroidJUnit4::class) @Config(theme = R.style.Theme_YourAppName) class MyFragmentTest { // 测试方法... }
不过对单测试方法单独指定主题的方式更灵活,适合不同测试场景的需求。
验证效果
设置主题后,LayoutInflater就能正确获取到主题里的所有属性,View Binding的inflate方法可以正常解析布局,那个UnsupportedOperationException和属性解析错误就会消失。
内容的提问来源于stack exchange,提问作者Tyler Wilbanks

