상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
오십견 통증을 줄이기 위한 전자기기 사용은 어떤가요?
오십견 환자가 겪는 일상적인 고뇌는 무엇인가요?
부항 치료의 지속 시간은 얼마인가요?
부항이 정서적 안정감에 도움이 될까요?
아저씨가 생각하는 가족의 의미는 무엇인가요?
아저씨는 어떤 방식으로 새로운 것을 배우려고 하시나요?
생명공학기술이 임상 연구에서의 데이터 해석에 미치는 영향은 무엇인가요?
50대 건강관리를 위한 체중 감량 하는 데 필요한 시간은?
50대 건강관리를 위한 좋은 습관 만드는 법은?
40대 건강관리를 위한 스트레스 관리 방법은 무엇인가요?
40대 건강관리에서 기타 질환 예방을 위한 방법은?
40대 건강관리를 위해 두통 완화 방법은 무엇인가요?
Previous
Next
수정하기 - Robolectric에서 네트워크 시간 초과를 테스트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric은 안드로이드 유닛 테스트를 JVM 환경에서 빠르게 실행할 수 있도록 돕는 프레임워크입니다. 그러나 Robolectric 자체는 네트워크 요청을 직접 수행하지 않으며, 네트워크 관련 코드는 주로 OkHttp, Retrofit, HttpURLConnection 같은 HTTP 클라이언트 라이브러리를 통해 실행됩니다. 따라서 네트워크 시간 초과(timeout) 같은 상황을 테스트하려면 네트워크 호출을 가로채거나 모킹(mocking)해야 합니다. Robolectric에서 네트워크 시간 초과 시나리오를 테스트하는 일반적인 방법은 다음과 같습니다: 1. HTTP 클라이언트의 네트워크 호출을 모킹한다 - OkHttp, Retrofit 등에서 제공하는 `Interceptor` 또는 `Call` 객체를 모킹하기 - Mockito, MockWebServer, MockK 같은 모킹 라이브러리를 사용해 호출을 가로채고 인위적으로 지연시키거나 예외(TimeoutException, SocketTimeoutException 등)를 발생시켜 네트워크 시간 초과 상태를 시뮬레이트 2. MockWebServer 사용하기 - Square에서 제공하는 `MockWebServer`를 활용하면 테스트용 가짜 HTTP 서버를 띄우고, 다양한 응답 지연이나 에러 상황을 직접 조작할 수 있다. - `MockWebServer` 응답에 딜레이(delay)를 주거나 특정 에러 코드를 내려 네트워크 지연 또는 타임아웃 상황을 재현 가능 - Robolectric 환경에서 MockWebServer는 별도의 안드로이드 컴포넌트가 아니므로 호환성 문제 없이 사용 가능하다는 장점 있음 3. 네트워크 호출을 감싸는 레포지토리/데이터 소스 레이어 레벨에서 직접 예외 발생시키기 - 이런 계층 단위에서 타임아웃 시 발생할 수 있는 예외를 강제로 던지도록 mocking하여, ViewModel이나 Presenter 등 상위 로직에서 예외 처리가 잘 되는지 검증 가능 4. OkHttp Timeout 설정과 테스트 - OkHttp의 `OkHttpClient`는 타임아웃(읽기, 연결, 쓰기)을 설정할 수 있다. - 테스트 시 이런 타임아웃이 적용되는지 확인하려면 MockWebServer와 함께 딜레이를 줘 타임아웃이 발생하게 유도 가능 5. Robolectric Shadow 객체 활용(간접적으로) - Robolectric은 Android 객체들을 Shadow 객체로 대체해 JVM상에서 동작하게 한다. - 직접 네트워크 요청 관련 Shadow 클래스가 많이 없기 때문에, 네트워크 호출은 별도로 모킹하는 식으로 처리하는 게 좋다. --- 예시 시나리오 (Retrofit + OkHttp + MockWebServer) ```java @Test public void testNetworkTimeout() throws Exception { MockWebServer mockWebServer = new MockWebServer(); // 딜레이를 주어 Timeout 발생 유도 (예: 5초 지연) mockWebServer.enqueue( new MockResponse() .setBody("{}") .setHeadersDelay(5, TimeUnit.SECONDS) // 응답 헤더 발송 지연 ); mockWebServer.start(); OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(2, TimeUnit.SECONDS) // 2초 타임아웃으로 설정 .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(mockWebServer.url("/")) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); try { apiService.getSomething().execute(); // 동기 호출 fail("Expected a timeout exception"); } catch (IOException e) { assertTrue(e instanceof SocketTimeoutException); } finally { mockWebServer.shutdown(); } } ``` 이 테스트는 응답 지연이 OkHttp 클라이언트 설정된 타임아웃보다 길기 때문에 네트워크 시간 초과 예외를 발생시켜, 이를 적절히 처리하는 코드가 잘 작동하는지 확인할 수 있게 한다. --- 정리 - Robolectric 자체는 네트워크 요청을 직접 수행하지 않으므로, 네트워크 관련 타임아웃 테스트는 HTTP 클라이언트 모킹 방식으로 접근한다. - MockWebServer를 이용해 실제 네트워크 대신 테스트 서버를 띄우고 시간 지연이나 에러를 시뮬레이션하는 것이 가장 대표적인 방법이다. - Mockito, MockK 같은 도구로 네트워크 레이어를 직접 모킹하고 타임아웃 예외를 던지게 하는 방법도 손쉽고 빠르다. - 테스트하려는 네트워크 라이브러리(OkHttp, Retrofit 등)의 타임아웃 설정을 명확히 한 뒤, 그에 맞춰 테스트 환경에서 인위적인 지연이나 예외를 발생시키는 게 핵심이다. 이런 방법들로 Robolectric 환경에서 네트워크 시간 초과가 발생하는 상황을 효과적으로 테스트할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기