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
相关产品推荐
相关产品推荐

