상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Robolectric에서 LifecycleOwner를 어떻게 테스트하나요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric 환경에서 Android 컴포넌트의 LifecycleOwner 동작을 테스트하는 방법은 주로 Activity나 Fragment 등의 라이프사이클을 시뮬레이션하면서 해당 LifecycleOwner에서 발생하는 이벤트와 상태 변화를 검증하는 것입니다. Robolectric은 JVM 환경에서 Android 프레임워크를 흉내 내므로 실제 디바이스 없이도 라이프사이클 콜백을 호출해 테스트할 수 있습니다. 1. LifecycleOwner 인터페이스 이해 LifecycleOwner는 androidx.lifecycle 패키지에 속하며, 내부에 Lifecycle 객체를 갖고 라이프사이클 상태 변화(lifecycle state changes)를 통지하는 역할을 합니다. Activity와 Fragment는 기본적으로 LifecycleOwner를 구현합니다. 2. Robolectric에서 LifecycleOwner 테스트의 기본 흐름 - Activity나 Fragment 객체를 Robolectric으로 생성한다. - getLifecycle()을 통해 해당 컴포넌트의 Lifecycle 객체를 얻는다. - LifecycleController 또는 직접 Activity/Fragment의 라이프사이클 메서드를 호출하여 상태 변화를 일으킨다. - Lifecycle 상태 변화에 따라 동작하는 코드를 검증한다. 3. 구체적인 절차와 팁 - Activity 테스트 시 ```java @RunWith(RobolectricTestRunner.class) public class MyActivityTest { private MyActivity activity; @Before public void setup() { // Robolectric을 통해 Activity 생성 및 라이프사이클 시작(onCreate~onResume) activity = Robolectric.buildActivity(MyActivity.class) .create() .start() .resume() .get(); } @Test public void testLifecycleOwner() { Lifecycle lifecycle = activity.getLifecycle(); // 초기 상태는 RESUMED assertEquals(Lifecycle.State.RESUMED, lifecycle.getCurrentState()); // 상태 변경을 시뮬레이션 해본다. // 예를 들어 onPause 호출 activityController.pause(); assertEquals(Lifecycle.State.STARTED, lifecycle.getCurrentState()); // onStop 호출 activityController.stop(); assertEquals(Lifecycle.State.CREATED, lifecycle.getCurrentState()); // 다시 onDestroy 호출 전 상태 등도 확인 가능 } } ``` - `Robolectric.buildActivity()`는 ActivityController를 반환하는데, 이 객체로 라이프사이클 메서드를 호출할 수 있다. 호출할 때마다 Lifecycle 상태가 자동으로 변하는 점을 활용한다. - Fragment 테스트 시 ```java @Test public void testFragmentLifecycleOwner() { FragmentController<MyFragment> controller = FragmentController.of(new MyFragment()); MyFragment fragment = controller.get(); controller.create() .start() .resume(); Lifecycle lifecycle = fragment.getLifecycle(); assertEquals(Lifecycle.State.RESUMED, lifecycle.getCurrentState()); controller.pause(); assertEquals(Lifecycle.State.STARTED, lifecycle.getCurrentState()); controller.stop(); assertEquals(Lifecycle.State.CREATED, lifecycle.getCurrentState()); } ``` - Fragment 역시 FragmentController를 통해 라이프사이클 상태를 직접 변경하며 테스트한다. 4. LiveData 및 Lifecycle 이벤트 테스트 LifecycleOwner를 구현한 객체에 LiveData 옵저버가 등록된 경우, 라이프사이클 상태 변화에 따라 옵저버 콜백이 호출되는지 검증할 수 있다. 중요한 점은 Robolectric 실행 환경에서 LiveData가 정상 작동하면, Lifecycle 상태를 변경하는 것만으로도 <a href='https://sangseek.com/sangseeks/Observer/ko'>Observer</a> 반응 테스트가 가능하다는 점이다. ```java @Test public void testLiveDataWithLifecycleOwner() { MutableLiveData<String> liveData = new MutableLiveData<>(); List<String> observedValues = new ArrayList<>(); MyActivity activity = Robolectric.buildActivity(MyActivity.class) .create() .start() .resume() .get(); liveData.observe(activity, observedValues::add); liveData.setValue("Hello"); assertEquals(Arrays.asList("Hello"), observedValues); // 상태를 바꿔 onPause 시킨 뒤 값 변경 -> 호출 안 됨 activityController.pause(); liveData.setValue("World"); assertEquals(Arrays.asList("Hello"), observedValues); } ``` 5. 별도 LifecycleOwner 구현체 테스트 만약 테스트할 대상 코드가 Activity나 Fragment가 아닌, 직접 구현한 LifecycleOwner 인스턴스라면, 직접 LifecycleRegistry를 생성하여 상태를 조작할 수 있다. ```java public class TestLifecycleOwner implements LifecycleOwner { private LifecycleRegistry lifecycleRegistry; public TestLifecycleOwner() { lifecycleRegistry = new LifecycleRegistry(this); lifecycleRegistry.setCurrentState(Lifecycle.State.INITIALIZED); } @Override public Lifecycle getLifecycle() { return lifecycleRegistry; } public void handleEvent(Lifecycle.Event event) { lifecycleRegistry.handleLifecycleEvent(event); } } @Test public void testCustomLifecycleOwner() { TestLifecycleOwner owner = new TestLifecycleOwner(); Lifecycle lifecycle = owner.getLifecycle(); assertEquals(Lifecycle.State.INITIALIZED, lifecycle.getCurrentState()); owner.handleEvent(Lifecycle.Event.ON_START); assertEquals(Lifecycle.State.STARTED, lifecycle.getCurrentState()); owner.handleEvent(Lifecycle.Event.ON_RESUME); assertEquals(Lifecycle.State.RESUMED, lifecycle.getCurrentState()); } ``` 이 방법은 Activity/Fragment를 생성할 필요 없이 동작하는 LifecycleOwner를 테스트할 때 유용하다. --- 요약 - Robolectric에서는 ActivityController, FragmentController를 활용해 Activity/Fragment의 라이프사이클을 직접 제어하면서 `getLifecycle()`을 통해 라이프사이클 상태를 검사할 수 있다. - 라이프사이클 상태 변화를 시뮬레이션하며 LiveData나 LifecycleObserver 등 관련 컴포넌트의 반응을 검증할 수 있다. - Activity나 Fragment가 아닌 별도 LifecycleOwner 구현체는 `LifecycleRegistry`를 직접 생성 및 조작해서 테스트할 수 있다. - 이런 절차를 통해 Robolectric 환경에서 라이프사이클 관련 로직을 단위 테스트할 수 있고, 안드로이드 UI 없이도 안정적으로 검증 가능하다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기