如何在robolectric测试中发生真正的连接错误时产生相同的异常?
我想知道如果网络当前不可用,程序将如何起作用。是否有可能为我的HttpClient生成相同的异常?
我已经尝试过:
Robolectric.getFakeHttpLayer().interceptHttpRequests(false); // with real network to a non existent IP
和
WifiManager wifiManager = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
和
Robolectric.addPendingHttpResponse(404, null);
但是没有一个像真正的连接一样产生相同的反应。
谢谢
答案 0 :(得分:2)
我检查了Robolectric
的{{1}},但没有找到模拟投掷FakeHttpLayer
的方法。
因此,使用模拟使其适合您。首先介绍IOException
(如果您使用HttpClientFactory
,则可以对HttpClient
使用相同的方法):
HttpUrlConnection
现在在您的网络层使用工厂而不是构造函数(为简单起见假设它是同步的):
public class HttpClientFactory {
public HttpClient createClient() {
return new DefaultHttpClient();
}
}
所以现在你可以在测试中使用public class HttpTransportLayer {
private final HttpClientFactory clientFactory;
public HttpTransportLayer() {
this(new HttpClientFactory());
}
// For tests only
HttpTransportLayer(HttpClientFactory clientFactory) {
this.clientFactory = clientFactory;
}
public String requestData(String url) {
HttpClient client = factory.createClient();
...
}
}
:
Mockito
这是虚拟测试,通常没有人会在出错时返回null。
您还可以查看一些依赖注入框架,如HttpClient mockedClient = mock(HttpClient.class);
@Before
public void setUp() {
HttpClientFactory factory = mock(HttpClientFactory.class);
when(factory.createClient()).thenReturn(mockedClient);
target = new HttpTransportLayer(factory);
}
@Test
public void whenIOExceptionThenReturnNull() {
when(mockedClient.execute(any(HtptUriRequest.class))).thenThrow(new IOException());
String data = target.requestData("http://google.com");
assertThat(data).isNull();
}
,以最大限度地减少注入代码。
如果您使用任何良好的网络架构,如Dagger
或Retrofit
,那么它甚至更简单 - 您不需要模拟任何东西,只需调用错误回调。
希望有所帮助