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();
```
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 프레임워크에 의존적인 코드를 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
조회수: 193 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.