Я проверил Robolectric
«s 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
:
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();
}
это фиктивный тест и нас в противном случае никто не вернет null в случае ошибки.
Вы также можете рассмотреть некоторые рамки для инъекций зависимостей, такие как Dagger
, чтобы свести к минимуму код инъекции.
Если вы используете какие-либо хорошие рамки для работы в сети, такие как Retrofit
или Volley
, то это еще проще - вам не нужно ничего издеваться и просто вызывать обратный вызов ошибки.
Надеюсь, это поможет
Спасибо за подсказки. Комбинация между фабрикой, кинжалом и реализацией HttpClient помогла мне :) – elCapitano
Благодарим за обмен –