使用robolectric更改某些资源字符串

时间:2013-10-30 12:20:52

标签: robolectric

我有一个工作的robolectric,想要测试我的应用程序的一个组件,它做了HTTP请求。由于我不希望这些请求转到我的实时服务器,而是转到本地测试服务器,我想在测试期间覆盖字符串资源(包含服务器主机名)。

但是,我无法在robolectric文档中找到任何与我想要的方向相关的内容:(

2 个答案:

答案 0 :(得分:7)

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

首先,告诉Robolectric使用部分模拟的Application并在使用应用程序上下文时返回:(感谢这个答案: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");

我希望这会有所帮助。

答案 1 :(得分:1)

您可以使用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;
}