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

如何Mock被@AndroidEntryPoint注解的Activity的成员方法?

问题根因

@AndroidEntryPoint是Hilt的注解,编译期会自动为被注解的Activity生成字节码增强的子类,修改原有类的初始化逻辑和方法调用链路,再加上Kotlin默认类、方法、属性都是final类型,Mockito默认无法直接Mock被修改过字节码的类的final属性getter,就会出现你遇到的Mock不生效的问题。
另外你当前测试代码存在明显笔误:Activity中定义的属性名为storefrontDelegates,但你测试代码中写的是storefrontDelegate,少了末尾的s,这也会导致Mock规则不匹配不生效。

可用解决方案

方案1(最推荐,架构优化)

不要将整个Activity实例传入ViewModel,这本身不符合Android架构规范,还会带来内存泄漏风险。你完全可以把ViewModel需要的StorefrontAnalytics、StorefrontDelegate还有资源获取能力直接作为构造参数传入ViewModel,不需要依赖Activity实例,这样就完全不需要Mock Activity,直接Mock这几个依赖即可,适配性最高也最稳定。

方案2(适配现有代码,修改Mock逻辑)

如果你暂时不想调整现有架构,可以通过以下修改让Mock生效:

  • 引入mockito-inline依赖替换默认的Mockito核心库,支持Mock final类和final方法
testImplementation "org.mockito:mockito-inline:4.8.1"
  • 修复测试代码的属性名笔误,同时如果还是不生效,可以在创建Mock实例时指定忽略注解配置:
val mock = Mockito.mock(ShopMenuActivity::class.java, Mockito.withSettings().withoutAnnotations())
  • 针对Kotlin属性的Mock,也可以换用mock-kotlin库,对Kotlin特性的适配比原生Mockito更好。

方案3(用Hilt测试能力+Robolectric)

如果你需要更贴近真实运行环境的测试,可以引入Hilt测试依赖和Robolectric,直接创建配置好Mock依赖的真实Activity实例,不需要手动Mock Activity本身:

  • 引入Hilt测试和Robolectric依赖
  • 测试类添加@HiltAndroidTest注解,通过@BindValue直接替换你需要Mock的依赖
  • 用Robolectric的ActivityScenario启动ShopMenuActivity即可拿到注入了Mock依赖的真实实例

内容的提问来源于stack exchange,提问作者S.Baltrukevich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:57:05