3

我有一个可以工作的 robolectric,并且想测试我的应用程序中执行 HTTP 请求的组件。由于我不希望这些请求发送到我的实时服务器,而是发送到本地测试服务器,因此我想在测试期间覆盖字符串资源(包含服务器主机名)。

但是,我无法在 robolectric 文档中找到任何朝着我想要的方向远程运行的内容:(

4

2 回答 2

7

我在 Robolectric 3 中遇到过类似的问题;您可以使用 Mockito 部分模拟覆盖应用程序级别的资源。

首先,您告诉 Robolectric 使用部分模拟的应用程序并在使用应用程序上下文时返回它:(感谢这个答案:https ://stackoverflow.com/a/31386831/327648 )

RuntimeEnvironment.application = spy(RuntimeEnvironment.application);
when(RuntimeEnvironment.application.getApplicationContext())
    .thenReturn(RuntimeEnvironment.application);

然后你部分模拟 Resources 对象:

Resources spiedResources = spy(app.getResources());
when(app.getResources())
    .thenReturn(spiedResources);

然后你可以做真正的覆盖:

when(spiedResources.getString(R.string.server_address))
    .thenReturn("local server address");

我希望这有帮助。

于 2015-07-29T10:32:16.713 回答
2

您可以使用http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html中提到的技术

这将允许您覆盖getResources()并使用间谍来返回硬编码的字符串或(默认情况下)从 res/values 加载的字符串:

@Override
public Resources getResources() {
    Resources resources = spy(super.getResources());
    when(resources.getString(R.string.server_address)).thenReturn("local test server address");

    return resources;
}
于 2013-11-19T19:43:13.463 回答