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

Robolectric에서 Intent를 테스트하는 방법은 무엇인가요?

_____
Q1. Robolectric에서 Intent 발송 여부를 어떻게 테스트하나요?
A1. 테스트 대상 액티비티나 컴포넌트에서 `startActivity(Intent)`를 호출했는지 검증하려면, `Shadows.shadowOf()` 메서드를 사용해 해당 액티비티의 그림자(Shadow)를 얻은 뒤 `getNextStartedActivity()`로 시작한 Intent를 조회합니다. 예:
```java
Intent startedIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertNotNull(startedIntent);
assertEquals(ExpectedActivity.class.getName(), startedIntent.getComponent().getClassName());
```

Q2. 특정 데이터나 액션을 가진 Intent가 생성되었는지 검사하려면?
A2. `getNextStartedActivity()`로 넘겨받은 Intent에서 `getAction()`, `getData()`, `getExtras()` 등을 호출해 필요한 값을 검증합니다. 예:
```java
Intent startedIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertEquals(Intent.ACTION_VIEW, startedIntent.getAction());
assertEquals(Uri.parse("http://example.com"), startedIntent.getData());
assertEquals("value", startedIntent.getStringExtra("key"));
```

Q3. 여러 개의 Intent가 순차적으로 발송되는 경우 어떻게 테스트하나요?
A3. 그림자 객체에서 `getNextStartedActivity()`를 여러 번 호출하면 호출 순서대로 Intent를 반환합니다. 호출 후에는 리스트에서 제거되어 매번 다음 Intent가 반환됩니다. 필요 시 `getStartedActivities()`로 모든 Intent 리스트를 한꺼번에 확인할 수 있습니다.

Q4. 특정 Intent가 발송되지 않았음을 검증하려면?
A4. `getNextStartedActivity()`가 `null`을 반환하는지 확인하거나, `getStartedActivities()` 리스트가 빈 상태인지 검증합니다. 예:
```java
Intent nextIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertNull(nextIntent);
```

Q5. 결과를 받는 startActivityForResult 호출은 어떻게 테스트하나요?
A5. Robolectric은 `shadowOf(activity).getNextStartedActivityForResult()`를 제공하지 않으므로, 일반적으로 커스텀 로직으로 `startActivityForResult` 호출 자체를 mocking 하거나, 직접 `ActivityResult`를 시뮬레이션해서 테스트합니다.

Q6. Intent에 인텐트 플래그(Intent Flags)가 설정되어 있는지 확인하려면?
A6. `getFlags()` 메서드를 사용해 설정된 플래그를 확인할 수 있습니다. 예:
```java
Intent startedIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertTrue((startedIntent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0);
```

Q7. 어떻게 Intent에 포함된 Serializable, Parcelable 데이터도 검증할 수 있나요?
A7. Intent의 `getSerializableExtra()` 또는 `getParcelableExtra()` 메서드를 통해 정상적으로 객체가 전달되었는지 테스트 가능합니다. Robolectric은 실제 객체를 그대로 반환합니다.

Q8. Robolectric에서 Intent 테스트 시 주의할 점은 무엇인가요?
A8. - 테스트 실행 전에 액티비티를 적절히 생성하고 resume 상태로 만들어야 Intent 호출 부분이 실행됩니다.
- Robolectric은 실제 안드로이드 OS가 아니므로 일부 시스템 Intent 동작이 다를 수 있습니다.
- 최신 Robolectric 버전을 사용하는 것이 Intent 관련 호환성에 유리합니다.

---

요약하면, Robolectric에서는 `ShadowActivity`의 `getNextStartedActivity()` 또는 `getStartedActivities()` 메서드로 Intent를 획득하여, 내부 액션, 데이터, extras, 플래그 등을 직접 확인하는 방식으로 Intent 관련 동작을 테스트합니다.
Robolectric을 사용하여 Android 단위 테스트에서 Intent를 테스트하는 방법에 대해 자세히 설명드리겠습니다.

Robolectric은 Android 프레임워크에 의존적인 코드를 JVM 환경에서 실행할 수 있게 해 주기 때문에, 실제 기기나 에뮬레이터 없이도 Intent 관련 동작을 검증할 수 있습니다.

1. Intent 생성 및 시작 확인 가장 기본적인 Intent 테스트는 `Activity` 또는 `Context`에서 특정 `Intent`가 제대로 생성되고, 시작되었는지 확인하는 것입니다.

예를 들어, 어떤 버튼 클릭 시 다음 화면(Activity)이 열리도록 하는 코드를 테스트한다고 가정해 봅시다: ```java public class MainActivity extends AppCompatActivity { void openDetail() { Intent intent = new Intent(this, DetailActivity.class); startActivity(intent); } } ``` 이 메서드가 호출될 때 `DetailActivity`로 가는 Intent가 생성되고 시작되는지를 확인하고 싶다면, Robolectric 테스트는 다음과 같이 작성할 수 있습니다: ```java @RunWith(RobolectricTestRunner.class) public class MainActivityTest { @Test public void openDetail_startsDetailActivity() { MainActivity activity = Robolectric.setupActivity(MainActivity.class); activity.openDetail(); Intent expectedIntent = new Intent(activity, DetailActivity.class); Intent actualIntent = Shadows.shadowOf(activity).getNextStartedActivity(); // Intent 비교: 구성 요소(component)가 같은지 검증 assertEquals(expectedIntent.getComponent(), actualIntent.getComponent()); } } ``` - `Shadows.shadowOf(activity).getNextStartedActivity()` 메서드를 통해 `startActivity()`에 전달된 실제 Intent를 얻을 수 있습니다.

- 생성된 Intent와 예상 Intent의 핵심적인 값을 비교하여 올바른 Intent가 만들어졌고, 시작되었는지 검증합니다.

---

2. Intent에 포함된 Extra 데이터 검증 Intent에는 데이터를 전달하기 위해 `putExtra` 메서드를 사용하여 추가 정보를 포함할 수 있습니다.

이런 데이터를 검증하는 것도 중요합니다.

예제: ```java void openDetailWithData() { Intent intent = new Intent(this, DetailActivity.class); intent.putExtra("user_id", 4

2); startActivity(intent); } ``` 테스트 코드: ```java @Test public void openDetailWithData_startsActivityWithExtras() { MainActivity activity = Robolectric.setupActivity(MainActivity.class); activity.openDetailWithData(); Intent startedIntent = Shadows.shadowOf(activity).getNextStartedActivity(); int userId = startedIntent.getIntExtra("user_id", -1); assertEquals(42, userId); } ``` - `getIntExtra()`, `getStringExtra()` 등을 이용하여 Intent에 담긴 값들이 원하는 대로 들어있는지 검사합니다.

---

3. startActivityForResult와 인텐트 결과 검증 만약 `startActivityForResult()`를 호출했다면, Robolectric은 결과 Intent를 시뮬레이션하여 테스트할 수 있습니다.

예: ```java void openDetailForResult() { Intent intent = new Intent(this, DetailActivity.class); startActivityForResult(intent, 100); } ``` 테스트에서는 `ShadowActivity`를 통해 시작된 인텐트와 요청 코드 등을 확인할 수 있습니다.

```java @Test public void openDetailForResult_startsActivityForResult() { MainActivity activity = Robolectric.setupActivity(MainActivity.class); activity.openDetailForResult(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); Intent startedIntent = shadowActivity.getNextStartedActivityForResult().intent; int requestCode = shadowActivity.getNextStartedActivityForResult().requestCode; assertEquals(new ComponentName(activity, DetailActivity.class), startedIntent.getComponent()); assertEquals(100, requestCode); } ``` ---

4. Intent 필터 및 액션 검사 Intent가 특정 액션이나 데이터 URI를 가지고 시작되는지 검증하는 경우도 있습니다.

예: ```java void openWebPage() { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://example.com")); startActivity(intent); } ``` 테스트: ```java @Test public void openWebPage_startsViewIntent() { MainActivity activity = Robolectric.setupActivity(MainActivity.class); activity.openWebPage(); Intent startedIntent = Shadows.shadowOf(activity).getNextStartedActivity(); assertEquals(Intent.ACTION_VIEW, startedIntent.getAction()); assertEquals(Uri.parse("http://example.com"), startedIntent.getData()); } ``` ---

5. 인텐트를 직접 생성해서 컴포넌트 테스트 또한, 인텐트를 직접 생성하고 `ActivityController`를 통해 테스트 용도로 전달도 가능합니다.

```java @Test public void detailActivity_receivesIntentData() { Intent intent = new Intent(RuntimeEnvironment.getApplication(), DetailActivity.class); intent.putExtra("user_id", 4

2); DetailActivity activity = Robolectric.buildActivity(DetailActivity.class, intent).setup().get(); // 액티비티가 인텐트를 잘 받고 처리했는지 검증 int userId = activity.getIntent().getIntExtra("user_id", -1); assertEquals(42, userId); } ``` --- 요약 - `Shadows.shadowOf(activity).getNextStartedActivity()` : `startActivity()` 호출 시 전달된 Intent를 가져올 때 사용 - Extra 데이터 검사 : `Intent.getXxxExtra()` 메서드를 통해 Intent에 포함된 데이터 검증 - `getNextStartedActivityForResult()` : `startActivityForResult()`에서 시작한 인텐트와 요청 코드를 확인 - Intent 액션 및 데이터 URI 검증 가능 - 테스트 대상 Activity에 인텐트를 직접 전달하여 검증 가능 --- 이와 같이 Robolectric 라이브러리를 사용하면, 실제 디바이스 없이도 Activity와 Intent 간의 상호작용과 데이터 전달이 올바르게 작동하는지 쉽게 검증할 수 있습니다.

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