我有一个可以工作的 robolectric,并且想测试我的应用程序中执行 HTTP 请求的组件。由于我不希望这些请求发送到我的实时服务器,而是发送到本地测试服务器,因此我想在测试期间覆盖字符串资源(包含服务器主机名)。
但是,我无法在 robolectric 文档中找到任何朝着我想要的方向远程运行的内容:(
我有一个可以工作的 robolectric,并且想测试我的应用程序中执行 HTTP 请求的组件。由于我不希望这些请求发送到我的实时服务器,而是发送到本地测试服务器,因此我想在测试期间覆盖字符串资源(包含服务器主机名)。
但是,我无法在 robolectric 文档中找到任何朝着我想要的方向远程运行的内容:(
我在 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");
我希望这有帮助。
您可以使用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;
}