2014-01-06 1 views
2

로보트 테스트에서 실제 연결 오류와 같은 예외를 생성하는 방법은 무엇입니까?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

내가 RobolectricFakeHttpLayer을 확인했습니다와 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

힌트를 보내 주셔서 감사합니다. Factory, Dagger와 HttpClient 구현을 결합하여 나를 도와주었습니다 :) – elCapitano

+0

공유 주셔서 감사합니다 –

관련 문제