상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
고조선의 군사력은 어느 정도였나요?
고조선의 전통적인 의식이나 제사는 어떻게 이루어졌나요?
카페인이 운동 성능에 미치는 영향은 무엇인가요?
안드로이드 오토의 사용자 인터페이스를 리셋하는 방법은 무엇인가요?
안드로이드 오토에서 사용할 수 있는 사진 편집 앱은 무엇인가요?
스테이크를 조리할 때의 기본적인 원칙은 무엇인가요?
스톡홀름의 주요 역사적 건축물은 무엇인가요?
스톡홀름의 주요 환경 보호 정책은 무엇인가요?
SQL 인젝션 공격의 예시를 들어주세요.
계란을 어떻게 깨야 가장 쉽게 깨질까요?
계란을 사용한 다양한 요리의 성공 사례는 무엇이 있나요?
타이어의 마모 지표는 어떻게 작동하나요?
Previous
Next
수정하기 - Robolectric에서 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", 42); 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", 42); 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순위입니다.
수정하기
취소하기