我有一个工作的robolectric,想要测试我的应用程序的一个组件,它做了HTTP请求。由于我不希望这些请求转到我的实时服务器,而是转到本地测试服务器,我想在测试期间覆盖字符串资源(包含服务器主机名)。
但是,我无法在robolectric文档中找到任何与我想要的方向相关的内容:(
答案 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;
}