Espresso测试中用FragmentScenario加载含Material组件XML时出现Inflate异常
解决Espresso测试中FragmentScenario加载Material组件布局的InflateException问题
嘿,我帮你搞定这个Espresso测试里的布局加载问题!你遇到的这个InflateException本质是测试环境中缺少Material主题的样式依赖——你的布局里用了Material组件(比如MaterialButton、TextInputLayout这类),但FragmentScenario默认的启动环境没给Fragment配上Material主题,导致系统解析不了组件需要的样式属性(比如报错里的TypedValue{t=0x2/d=0x7f03009f a=-1},就是Material主题里定义的属性)。
两种快速解决方法
方法一:启动Fragment时直接指定Material主题
调用launchFragmentInContainer的时候,多传一个themeResId参数,把你项目里的Material主题ID传进去就行。比如:
Kotlin示例
val scenario = launchFragmentInContainer<YourTargetFragment>( themeResId = R.style.Theme_YourAppMaterialTheme // 换成你项目里的Material主题 )
Java示例
FragmentScenario<YourTargetFragment> scenario = FragmentScenario.launchInContainer( YourTargetFragment.class, null, R.style.Theme_YourAppMaterialTheme // 换成你项目里的Material主题 );
方法二:给测试单独整个专属Material主题
如果你的测试用例都需要统一的Material主题,可以在src/androidTest/res/values/styles.xml里新建一个测试主题:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="TestMaterialTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 按需添加测试需要的样式属性,比如基础颜色 --> <item name="colorPrimary">@color/design_default_color_primary</item> <item name="colorAccent">@color/design_default_color_accent</item> </style> </resources>
之后启动Fragment时用这个测试主题就行:
launchFragmentInContainer<YourTargetFragment>(themeResId = R.style.TestMaterialTheme)
小提醒
- 确认布局里的组件是正经的Material组件(比如
com.google.android.material.button.MaterialButton,不是原生的Button),别搞混组件类型; - 如果你的Fragment在代码里自己设置了主题,也要确保测试环境能访问到对应的资源哦。
内容的提问来源于stack exchange,提问作者MatPag
相关产品推荐
相关产品推荐

