Robolectric에서 LifecycleOwner를 어떻게 테스트하나요?
_____A1: Robolectric은 기본적으로 Android 프레임워크와 유사한 환경을 제공하기 때문에, Activity나 Fragment 같은 컴포넌트에 대해 LifecycleOwner 동작을 직접 테스트할 수 있습니다. 테스트 대상 객체가 LifecycleOwner을 구현하거나 Activity/Fragment를 상속했다면, `LifecycleRegistry`를 통해 수동으로 라이프사이클 상태를 변경하며 테스트할 수 있습니다.
---
Q2: Lifecycle 이벤트를 수동으로 트리거하려면 어떻게 해야 하나요?
A2: 테스트 중 `LifecycleRegistry` 객체를 생성해 테스트 대상 클래스에 전달하거나, Activity/Fragment의 라이프사이클 메서드를 직접 호출하여 라이프사이클 상태를 변경할 수 있습니다. 예를 들어:
```java
LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(myLifecycleOwner);
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
// ...
```
또는 Robolectric의 `ActivityController`를 사용해 라이프사이클 메서드를 호출할 수 있습니다.
---
Q3: Activity나 Fragment 같은 LifecycleOwner를 Robolectric에서 어떻게 초기화하고 라이프사이클을 테스트하나요?
A3: Robolectric의 `Robolectric.buildActivity()` 메서드를 사용하여 ActivityController를 얻은 뒤, `create()`, `start()`, `resume()` 등 메서드를 순차 실행하여 라이프사이클을 진행시킬 수 있습니다.
```java
ActivityController
MyActivity activity = controller.create().start().resume().get();
// 테스트 코드에서 Lifecycle 상태 확인 가능
Lifecycle lifecycle = activity.getLifecycle();
assertEquals(Lifecycle.State.RESUMED, lifecycle.getCurrentState());
```
마찬가지로 Fragment도 `FragmentScenario` 또는 FragmentController를 사용해 비슷한 방식으로 테스트가 가능합니다.
---
Q4: 커스텀 클래스가 LifecycleOwner를 구현할 때 Robolectric 테스트는 어떻게 작성하나요?
A4: 커스텀 클래스에서는 `LifecycleRegistry`를 멤버로 두고 `getLifecycle()`에서 반환합니다. 테스트 시, 다음처럼 라이프사이클 이벤트를 직접 발생시키고 동작을 확인할 수 있습니다.
```java
public class MyLifecycleOwner implements LifecycleOwner {
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
@Override
return lifecycleRegistry;
}
public void onStart() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
// 기타 lifecycle 메서드...
}
```
테스트:
```java
MyLifecycleOwner owner = new MyLifecycleOwner();
owner.onStart();
assertEquals(Lifecycle.State.STARTED, owner.getLifecycle().getCurrentState());
```
---
Q5: Robolectric 테스트에서 LifecycleOwner 기반 컴포넌트의 LiveData 등을 어떻게 검증하나요?
A5: LifecycleOwner가 활성화 된 상태임을 보장한 후 LiveData 옵저버를 붙이고, 라이프사이클 이벤트를 트리거하여 LiveData의 데이터 변경에 따른 UI나 로직 반응을 검증할 수 있습니다. 예를 들어,
```java
MyActivity activity = Robolectric.buildActivity(MyActivity.class).create().start().resume().get();
LiveData
Observer
liveData.observe(activity, observer);
activity.getLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
verify(observer).onChanged(anyString());
```
---
요약:
- Robolectric으로 Activity, Fragment를 빌드하고 라이프사이클 메서드를 호출해 라이프사이클 상태를 조작한다.
- 커스텀 LifecycleOwner는 `LifecycleRegistry`를 수동으로 조작해 이벤트를 발생시키면 된다.
- LiveData 관찰자 등록과 같은 구조도 활성 라이프사이클 상태 내에서 테스트 가능하다.
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
4. LiveData 및 Lifecycle 이벤트 테스트 LifecycleOwner를 구현한 객체에 LiveData 옵저버가 등록된 경우, 라이프사이클 상태 변화에 따라 옵저버 콜백이 호출되는지 검증할 수 있다.
중요한 점은 Robolectric 실행 환경에서 LiveData가 정상 작동하면, Lifecycle 상태를 변경하는 것만으로도 Observer 반응 테스트가 가능하다는 점이다.
```java @Test public void testLiveDataWithLifecycleOwner() { MutableLiveData
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년 전
2025-05-26 03:51:40
조회수: 205 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 205 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.