使用Paparazzi测试Composable截图时遇animator_duration_scale获取失败及空指针问题
问题背景
使用Paparazzi执行Composable组件截图测试时触发NullPointerException,报错提示View measure failed。
报错信息
Nov 25, 2022 10:53:52 AM app.cash.paparazzi.internal.PaparazziLogger logAndroidFramework
INFO: Settings [3]: Can't get key animator_duration_scale from content://settings/global
Nov 25, 2022 10:53:53 AM app.cash.paparazzi.internal.PaparazziLogger error
SEVERE: broken: View measure failed
java.lang.NullPointerException
项目配置与代码
1. 项目级build.gradle classpath
classpath ("app.cash.paparazzi:paparazzi-gradle-plugin:1.1.0")
2. 模块级build.gradle插件
plugins { ... id("app.cash.paparazzi") }
3. 测试代码
class PaparazziExampleTest { @get:Rule var paparazzi = Paparazzi() @Test fun myComposableTest() { paparazzi.snapshot() { MyComposable("Hello") } } }
4. Composable组件代码
@Composable fun MyComposable(title: String) { Text( text = title, color = Brown, style = MaterialTheme.typography.titleMedium, maxLines = 3, overflow = TextOverflow.Ellipsis, ) }
解决方案
1. 补全MaterialTheme上下文
你的MyComposable直接依赖MaterialTheme.typography,但测试代码中未提供MaterialTheme上下文,导致主题相关对象为空触发空指针。修改测试代码,将Composable包裹在MaterialTheme中:
@Test fun myComposableTest() { paparazzi.snapshot() { MaterialTheme { MyComposable("Hello") } } }
2. 验证颜色资源可用性
Brown如果是自定义颜色资源,需确保测试环境能正确访问。可临时替换为系统内置颜色Color.Brown,或确认颜色资源已在测试源集中配置。
3. 升级Paparazzi版本
1.1.0版本存在Composable测试的兼容性问题,建议升级到2.0.0+的稳定版本,修复了不少空指针和测量失败的已知问题。修改项目级classpath:
classpath ("app.cash.paparazzi:paparazzi-gradle-plugin:2.1.0")
4. 自定义测试主题(可选)
如果需要使用应用自定义主题,可在初始化Paparazzi实例时指定:
@get:Rule var paparazzi = Paparazzi( theme = "Theme.MyApp" // 替换为你的应用主题ID )
内容的提问来源于stack exchange,提问作者AngelesVP

