2014-01-06 3 views
2

Как можно получить то же исключение, что и при реальной ошибке соединения в тестах robolectric?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); 

, но ни один из них не производит те же реакции, как реальное соединение-проигрышные.

Спасибо

ответ

2

Я проверил 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, то это еще проще - вам не нужно ничего издеваться и просто вызывать обратный вызов ошибки.

Надеюсь, это поможет

+0

Спасибо за подсказки. Комбинация между фабрикой, кинжалом и реализацией HttpClient помогла мне :) – elCapitano

+0

Благодарим за обмен –

Смежные вопросы