상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
몸매관리, 행복한 삶을 위한 6가지 방법
노로바이러스의 징후를 알려주는 7가지 신호
통풍과 요산, 알고 계셔야 하는 6가지 사실
거식증 극복을 위한 10가지 자기개발 방법
방귀가 친구를 더욱 친밀하게 만드는 7가지 이유
방귀에 대한 오해: 8가지 진실
수족구병이 의심된다면? 체크해야 할 6가지 증상!
수족구병, 진단과 치료의 4가지 주요 포인트
십이지장을 위한 9가지 비타민과 미네랄
위고비의 인기 비결, 8가지 이유!
등살빼기: 7일 노하우로 완벽한 뒷모습 얻기
등살빼기: 8가지 재미로 지속 가능한 체중 감량!
Previous
Next
수정하기 - Robolectric에서 UI 스레드에서의 실행을 어떻게 제어하나요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric을 사용하여 Android UI 테스트를 작성할 때, UI 스레드(메인 스레드)에서 실행되는 코드를 제어하는 방법은 중요합니다. 안드로이드에서는 UI와 관련된 작업은 반드시 메인 스레드에서 실행되어야 하기 때문에, 테스트 시에도 UI 스레드 환경을 적절히 시뮬레이션하거나 강제로 해당 스레드에서 실행해야 합니다. Robolectric은 기본적으로 테스트 코드를 메인(UI) 스레드에서 실행하도록 설계되어 있습니다. 이를 통해 별도의 스레드 전환 없이도 UI와 관련된 작업을 안전하게 테스트할 수 있는데, 여기서 UI 스레드 실행을 제어하는 주요 방법들을 정리하면 다음과 같습니다. 1. @<a href='https://sangseek.com/sangseeks/UiThreadTest/ko'>UiThreadTest</a> <a href='https://sangseek.com/sangseeks/어노테이션/ko'>어노테이션</a> 사용 Robolectric은 AndroidJUnitRunner와 달리 기본적으로 메인 스레드에서 테스트가 실행되기 때문에 보통 @UiThreadTest가 굳이 필요하지 않지만, 만약 명시적으로 UI 스레드에서 실행하여야 하는 테스트 임을 표시하고 싶다면 사용할 수 있습니다. 이 어노테이션을 사용하면 해당 테스트 메서드의 실행이 UI 스레드에서 이루어집니다. ```java @Test @UiThreadTest public void testUiThread() { // UI관련 작업 수행 } ``` Robolectric 최신 버전에서는 @UiThreadTest가 없어도 기본적으로 UI 스레드에서 실행되기 때문에 필수적이지는 않지만, 의도를 명확히 하기 위해 사용할 수 있습니다. 2. ShadowLooper와 <a href='https://sangseek.com/sangseeks/runPaused/ko'>runPaused</a>를 활용한 작업 스케줄링 제어 Robolectric 내부에서는 메인 스레드의 메시지 큐를 `ShadowLooper`가 감시하며, 테스트 중 특정 시점에 실행할 작업 처리를 수동으로 제어할 수 있습니다. 예를 들어 UI 스레드에 포스트된 작업을 즉시 실행하거나 중지할 수 있습니다. ```java ShadowLooper mainLooper = Shadows.shadowOf(Looper.getMainLooper()); mainLooper.runToEndOfTasks(); // 큐에 쌓인 작업 모두 실행 mainLooper.pause(); mainLooper.runOneTask(); // 한 작업만 실행 ``` 이를 통해 UI 스레드에서 비동기(post, postDelayed 등)로 스케줄된 작업의 실행 시점을 상세히 제어할 수 있습니다. 3. @Config annotation과 schedulers 설정 조작 Robolectric의 `@Config` 어노테이션 옵션에서, 특정 스케줄러 동작 방식을 설정할 수 있지만 실제로 UI 스레드는 기본적으로 잘 처리됩니다. 주로 RxJava 같은 서드파티 스케줄러를 테스트할 때 사용됩니다. 4. <a href='https://sangseek.com/sangseeks/runOnUiThread/ko'>runOnUiThread</a> 혹은 Instrumentation 테스트의 runOnMainSync 대체 실제 Android Instrumentation 테스트에서는 `Instrumentation.runOnMainSync()`를 통해 UI 스레드에서 코드를 실행할 수 있으나, Robolectric은 JVM 환경에서 실행되므로 실제 메인 스레드가 아닌 자체 메인 루퍼를 사용합니다. 그렇기 때문에 UI 작업은 그냥 테스트 메서드 내에서 수행하면 되며, 필요 시 `ShadowLooper`를 활용해 예약 작업들의 실행 시기를 조작할 수 있습니다. 5. AsyncTask나 Handler를 사용할 때 테스트 중 실행 강제 AsyncTask는 기본적으로 메인 스레드에서 콜백이 수행되어야 하는데, Robolectric은 내장된 ShadowAsyncTask를 통해 이를 지원합니다. AsyncTask 실행 후 `Runnable` 콜백 등을 제어할 때도 `ShadowLooper`로 UI 스레드 메시지 큐를 컨트롤할 수 있습니다. --- 정리 - Robolectric은 기본적으로 테스트를 UI 스레드 환경에서 실행하기 때문에 따로 UI 스레드 전환 코드를 쓰지 않아도 됨 - UI 스레드에서 실행해야 할 테스트 메서드에는 `@UiThreadTest`를 사용할 수 있으나 필수 아님 - UI 스레드 메시지 큐의 작업 실행 제어는 `ShadowLooper`를 사용해 처리 - 별도의 UI 스레드 실행 메서드(runOnUiThread 등)는 필요하지 않으며, 해당 코드를 호출할 경우에도 Robolectric의 Shadow로 적절히 처리됨 따라서 Robolectric에서는 UI 관련 코드 테스트 시, 특별한 스레드 처리 없이 기본 테스트 코드 내에서 안전하게 UI 스레드 환경을 시뮬레이션하며, 메시지 루프 제어가 필요하면 `ShadowLooper`를 활용하여 UI 스레드 내 작업 실행 시점을 세밀하게 조절할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기