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

Robolectric 3.8中Shadows.shadowOf(Context)方法找不到问题咨询

解决Robolectric 3.8中模拟自定义系统服务的问题

嘿,我刚搞定过类似的情况——Robolectric 3.x之后确实把shadowOf(android.content.Context)给弃用了,官方迁移文档没提这块确实挺坑的。不过咱们换个方式就能实现模拟自定义系统服务的需求,具体操作如下:

1. 直接通过ShadowApplication注册模拟服务

你已经拿到了Application实例,接下来不用再绕shadowOf(Context),直接用Shadow.extract()获取ShadowApplication,然后调用它的setSystemService()方法就能注册你的模拟服务了:

// 先创建你的自定义服务Mock对象
MyService myServiceMock = Mockito.mock(MyService.class);

// 获取Application实例
Application application = (Application) ShadowApplication.getInstance().getApplicationContext();

// 提取对应的ShadowApplication
ShadowApplication shadowApplication = Shadow.extract(application);

// 注册服务:第一个参数是你的服务名称(比如自定义的服务常量),第二个是Mock对象
shadowApplication.setSystemService("my_custom_service", myServiceMock);

2. 针对ContextImpl的场景(可选)

如果你的测试场景需要在ContextImpl层面设置服务,也可以用同样的Shadow.extract()方式获取ShadowContextImpl来操作:

ContextImpl contextImpl = (ContextImpl) application.getBaseContext();
ShadowContextImpl shadowContext = Shadow.extract(contextImpl);
shadowContext.setSystemService("my_custom_service", myServiceMock);

3. 验证服务是否生效

之后在测试代码里调用context.getSystemService("my_custom_service"),就能拿到你刚才模拟的myServiceMock了,正常用Mockito做方法调用验证就行:

MyService service = (MyService) context.getSystemService("my_custom_service");
Mockito.verify(service).yourMethodToTest();

小提醒:如果你的自定义服务用了@ServiceName注解或者有固定的系统服务名称字符串,一定要确保setSystemService()里传入的名称和它一致,不然会找不到对应的服务哦。

内容的提问来源于stack exchange,提问作者Aaron Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:25