如何在Dagger Hilt环境下运行android-testify截图测试
Dagger Hilt 与 Testify 截图测试冲突解决方案
报错信息:
Caused by: java.lang.IllegalStateException: The component was not created. Check that you have added the HiltAndroidRule.
冲突核心原因是ScreenshotRule默认会在测试初始化阶段自动启动目标Activity,此时Hilt的依赖注入流程还未完成,触发组件未创建异常。如果单独给两个Rule添加@get:Rule注解,AndroidJUnitRunner无法保证执行顺序,会导致原本正常的Hilt测试也出现报错。
具体解决步骤
- 首先确保测试类顶部添加了
@HiltAndroidTest注解,这是所有Hilt测试的必备配置 - 选择以下任意一种方式控制Rule执行顺序即可解决冲突:
方式1:使用RuleChain绑定执行顺序(推荐)
通过RuleChain强制指定HiltAndroidRule先执行,完成注入后再执行ScreenshotRule逻辑:
@HiltAndroidTest class HomePageScreenshotTest { @get:Rule val testRuleChain: RuleChain = RuleChain // 外层Rule优先执行 .outerRule(HiltAndroidRule(this)) .around(ScreenshotRule(HomeActivity::class.java)) @Test fun testHomePageDefaultState() { testRuleChain.getRule(ScreenshotRule::class.java).assertSame() } }
Java写法同理:
@HiltAndroidTest public class HomePageScreenshotTest { @Rule public RuleChain testRuleChain = RuleChain .outerRule(new HiltAndroidRule(this)) .around(new ScreenshotRule(HomeActivity.class)); @Test public void testHomePageDefaultState() { testRuleChain.getRule(ScreenshotRule.class).assertSame(); } }
方式2:禁用自动启动,手动控制初始化流程
如果需要自定义注入逻辑或者测试前置配置,可以禁用ScreenshotRule的自动启动能力,等Hilt注入完成后再手动启动Activity:
@HiltAndroidTest class HomePageScreenshotTest { @get:Rule val hiltRule = HiltAndroidRule(this) @get:Rule val screenshotRule = ScreenshotRule(HomeActivity::class.java) .setLaunchActivity(false) // 关闭自动启动Activity @Before fun setUp() { // 先完成Hilt注入 hiltRule.inject() // 注入完成后手动启动Activity screenshotRule.launchActivity() } @Test fun testHomePageDefaultState() { screenshotRule.assertSame() } }
注意事项
- 所有需要调用Activity上下文的Testify配置方法(如
setViewModifications、setScreenshotViewProvider等),都需要放在Hilt注入完成之后执行,避免出现空指针或者注入失败问题 - 如果测试中用到了
@Inject注入的自定义依赖,必须在启动ScreenshotRule的Activity之前执行hiltRule.inject()
内容的提问来源于stack exchange,提问作者Nickthegoatboy
相关产品推荐
相关产品推荐

