You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:36:03