2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Robolectric에서 Activity를 어떻게 테스트하나요?

_____
Q1: Robolectric이란 무엇인가요?
A1: Robolectric은 안드로이드 애플리케이션의 유닛 테스트를 JVM 환경에서 빠르게 실행할 수 있도록 해 주는 프레임워크입니다. 실제 디바이스나 에뮬레이터 없이도 Activity 등 안드로이드 컴포넌트를 테스트할 수 있습니다.

---

Q2: Activity를 Robolectric으로 테스트하려면 기본적으로 무엇이 필요한가요?
A2:
- `robolectric` 라이브러리를 Gradle에 추가한다.
- 테스트 클래스는 `@RunWith(RobolectricTestRunner.class)` 어노테이션을 붙인다.
- `Robolectric.buildActivity(YourActivity.class).create().start().resume().get()`를 이용해 Activity 인스턴스를 생성한다.

---

Q3: Robolectric으로 Activity 인스턴스 생성 방법은?
A3:
```java
YourActivity activity = Robolectric.buildActivity(YourActivity.class)
.create()
.start()
.resume()
.get();
```
이 코드는 Activity의 라이프사이클 메서드를 순차적으로 호출하여 완전한 상태의 Activity 객체를 반환합니다.

---

Q4: Activity의 UI 컴포넌트는 어떻게 접근하나요?
A4: Activity 객체에서 일반적으로 `findViewById()` 메서드로 접근할 수 있습니다. 예를 들어:
```java
TextView textView = activity.findViewById(R.id.text_view);
assertEquals("Hello", textView.getText().toString());
```

---

Q5: 클릭 이벤트 등 UI 이벤트는 어떻게 시뮬레이션하나요?
A5: `performClick()` 메서드를 호출하거나 직접 리스너 메서드를 호출합니다. 예:
```java
Button button = activity.findViewById(R.id.button);
button.performClick();
```
이를 통해 UI 이벤트에 따른 반응을 테스트할 수 있습니다.

---

Q6: Intent를 통한 Activity 전환은 어떻게 테스트하나요?
A6: `ShadowActivity getNextStartedActivity()` 메서드를 사용하여 다음에 시작된 Intent를 확인할 수 있습니다. 예:
```java
Intent nextIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertEquals(TargetActivity.class.getName(), nextIntent.getComponent().getClassName());
```

---

Q7: Activity의 라이프사이클 상태를 직접 제어할 수 있나요?
A7: 네. `ActivityController`를 사용해 다음과 같이 라이프사이클 단계를 자유롭게 호출할 수 있습니다.
```java
ActivityController controller = Robolectric.buildActivity(YourActivity.class);
controller.create();
controller.start();
controller.resume();
YourActivity activity = controller.get();
```

---

Q8: Robolectric 테스트에서 AndroidManifest 설정은 어떻게 하나요?
A8: 기본적으로 Robolectric은 모듈의 `AndroidManifest.xml`을 자동 인식합니다. 따로 매니페스트를 지정하려면 `@Config(manifest= "src/main/AndroidManifest.xml")`를 테스트 클래스나 메서드에 붙일 수 있습니다.

---

Q9: 특정 리소스를 테스트 시에 어떻게 사용할 수 있나요?
A9: Resource 관련 테스트도 `activity.getResources()`를 통해 접근 가능하며, 문자열, 색상 등 리소스를 정상적으로 로드할 수 있습니다.

---

요약:
Robolectric을 이용하면 Android 에뮬레이터 없이 JVM 테스트 환경에서 Activity를 생성하고 라이프사이클을 제어하며, UI 컴포넌트 조작, 이벤트 시뮬레이션, Intent 인식 등 포괄적인 테스트가 가능합니다. 핵심은 `Robolectric.buildActivity()` 및 `ShadowActivity` 클래스를 활용하는 것입니다.
Robolectric은 안드로이드 컴포넌트를 JVM 환경에서 테스트할 수 있도록 도와주는 프레임워크입니다.

실제 디바이스나 에뮬레이터 없이도 안드로이드 Activity를 실행하고 생명주기를 제어할 수 있어, 단위 테스트에 매우 유용합니다.

Robolectric으로 Activity를 테스트하는 기본적인 방법과 주요 개념을 다음과 같이 자세히 설명드리겠습니다.

1. Robolectric 의존성 추가 먼저 테스트 모듈(build.gradle)에 Robolectric 의존성을 추가해야 합니다.

일반적으로 다음과 같이 추가합니다: ```gradle testImplementation "org.robolectric:robolectric:4.10" // 최신 버전에 맞게 조절하세요 testImplementation "junit:junit:4.13.2" ``` ---

2. 기본 테스트 클래스 구성 테스트 클래스에는 JUnit의 `@RunWith(RobolectricTestRunner.class)` 어노테이션을 추가해서 Robolectric 환경에서 실행되도록 합니다.

```java @RunWith(RobolectricTestRunner.class) public class MainActivityTest { // 테스트 코드 작성 } ``` ---

3. Activity 생성 및 생명주기 제어 Robolectric에서는 `Robolectric.buildActivity(ActivityClass.class)`를 이용해 Activity를 빌드하고, `.create()`, `.start()`, `.resume()`, `.visible()` 등의 메소드를 연결하여 Activity 생명주기를 시뮬레이션할 수 있습니다.

예를 들어 `MainActivity`를 테스트한다고 하면: ```java ActivityController controller = Robolectric.buildActivity(MainActivity.class); MainActivity activity = controller.create().start().resume().visible().get(); ``` - `.create()` : onCreate() 호출 - `.start()` : onStart() 호출 - `.resume()` : onResume() 호출 - `.visible()` : 윈도우가 화면에 보이게 됨(onWindowFocusChanged 등 트리거) - `.get()` : 실제 Activity 인스턴스를 리턴 필요에 따라 원하는 생명주기 시점까지만 호출해도 되고, 한 번에 chained 호출도 가능합니다.

---

4. UI 요소 접근 및 검증 `activity.findViewById(R.id.뷰아이디)`를 통해 UI 요소를 가져올 수 있으며, UI 상태 변경이나 텍스트, 클릭 이벤트 등을 검사할 수 있습니다.

예: ```java TextView tv = activity.findViewById(R.id.textView); assertEquals("Hello, Robolectric!", tv.getText().toString()); ``` ---

5. 이벤트 시뮬레이션 버튼 클릭 같은 이벤트도 다음과 같이 직접 호출하거나 Robolectric의 `ShadowView` 등을 이용해 시뮬레이션할 수 있습니다.

```java Button button = activity.findViewById(R.id.button); button.performClick(); // 클릭 시의 변화가 제대로 일어났는지 검증 ``` 또는 Intent나 메뉴 이벤트도 수동으로 호출 가능합니다.

---

6. Intent 테스트 Activity가 특정 인텐트를 받거나 보낼 때는 다음과 같이 인텐트를 만들어 빌드 단계에서 전달할 수 있습니다.

```java Intent intent = new Intent(RuntimeEnvironment.getApplication(), MainActivity.class); intent.putExtra("key", "value"); ActivityController controller = Robolectric.buildActivity(MainActivity.class, intent); MainActivity activity = controller.create().start().resume().get(); ``` ---

7. Activity 종료와 상태 저장 테스트 `controller.pause()`, `controller.stop()`, `controller.destroy()` 로 Activity의 생명주기 종료 단계를 테스트할 수 있습니다.

또한 `controller.saveInstanceState()`를 통해 상태 번들을 받아 `onSaveInstanceState()` 콜백을 테스트하거나, 저장된 상태를 넣고 다시 Activity를 생성할 수 있습니다.

---

8. 테스트 예시 코드 전체 ```java @RunWith(RobolectricTestRunner.class) public class MainActivityTest { private MainActivity activity; @Before public void setup() { activity = Robolectric.buildActivity(MainActivity.class) .create() .start() .resume() .visible() .get(); } @Test public void testTextViewText() { TextView tv = activity.findViewById(R.id.textView); assertNotNull(tv); assertEquals("Hello, Robolectric!", tv.getText().toString()); } @Test public void testButtonClick_changesText() { Button button = activity.findViewById(R.id.button); TextView tv = activity.findViewById(R.id.textView); button.performClick(); assertEquals("Clicked!", tv.getText().toString()); } } ``` --- 정리 - Robolectric 환경에서 `RobolectricTestRunner`를 이용해 테스트 클래스 선언 - `Robolectric.buildActivity()`로 ActivityController를 얻고 생명주기 시뮬레이션 - `get()`으로 실제 Activity 인스턴스를 구해 UI 요소에 접근 - `findViewById()`, `performClick()` 등으로 UI 조작 및 상태 검증 - Intent 전달도 가능하며 생명주기 종료 단계도 테스트 가능 이렇게 하면 실제 디바이스나 에뮬레이터를 사용하지 않고 로컬 JVM 환경에서 빠르게 Activity 동작을 검증할 수 있습니다.

작성자: 최현우 [비회원] | 작성일자: 1년 전 2025-05-26 03:51:06
조회수: 160 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.