Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何转换RuntimeEnvironment.application?_Android_Mockito_Robolectric_Powermock_Powermockito - Fatal编程技术网

Android 如何转换RuntimeEnvironment.application?

Android 如何转换RuntimeEnvironment.application?,android,mockito,robolectric,powermock,powermockito,Android,Mockito,Robolectric,Powermock,Powermockito,运行Robolectric测试时,RuntimeEnvironment.application的类型由您的配置决定。假设我将RoboApplication.class配置为我的测试应用程序,我可以将RuntimeEnvironment.application强制转换为我的类型,不会失败 RoboApplication app = (RoboApplication) RuntimeEnvironment.application; app.doSomething(); 然而,一旦我集成了Power

运行Robolectric测试时,
RuntimeEnvironment.application
的类型由您的配置决定。假设我将RoboApplication.class配置为我的测试应用程序,我可以将RuntimeEnvironment.application强制转换为我的类型,不会失败

RoboApplication app = (RoboApplication) RuntimeEnvironment.application;
app.doSomething();
然而,一旦我集成了PowerMock,演员阵容就会失败

java.lang.ClassCastException: RoboApplication cannot be cast to RoboApplication

如何解决此问题?

这是一个问题,因为PowerMock和Robolectric由于使用自己的类加载器而互不兼容

尽管名称相同,但类对象实际上并不相同:Robolectric和PowerMock都是通过自定义类加载器加载测试来工作的。这些类加载器更改了相关的类,允许您替换静态/最终Android系统类和方法[Robolectric]或所有静态/最终类[PowerMock]。这是PowerMock和Robolectric都依赖于拥有自己的JUnit4 Runner的部分原因:这样他们就可以从自己的修改类加载器中加载适当的类

因此,即使实例具有相同的名称并源自相同的源文件,也不能将实例强制转换为其他实例的类:每个框架都可以更改类实现,因此它们不一定彼此兼容

您需要选择一个或另一个框架:使用,可能直接与EasyMock或Mockito一起使用,或者使用PowerMock手动存根Android基础设施调用

另见:


启动Dagger2模块时,我还需要一个应用程序参考。经过几次尝试,并得到相同的铸造异常错误,你得到我的应用程序如下

public class App extends Application {

private static AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();

    if( appComponent==null ){

        appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build();
    }
}

public static AppComponent getAppComponent() {
    return appComponent;
}

public static void setAppComponent(AppComponent component){
    appComponent = component;
}
}

在我的Robolectric/PowerMock测试仪中:

@Before
public void before() throws Exception {

    App appMocked = PowerMockito.mock(App.class);
    App.setAppComponent(DaggerAppComponent.builder().appModule(new AppModule(appMocked)).build());
    ....
}
然后我的活动只是调用了
App.getAppComponent().inject(这个)

仅供参考,我试图不模仿app类,而是使用了
((app)RuntimeEnvironment.application)
,但没有成功。我还尝试将其子类化,并在Robolectric的应用程序配置中使用它,但最终导致了铸造问题。所以我希望这能有所帮助


当然,那个二传手不应该投入生产。但这是我唯一能找到工作的方法。

你能在调试全名中看到吗?是的,我能看到,它是RoboApplication,配置中的同一类型。谢谢你的精彩报道!