상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Robolectric에서 FragmentTransaction을 테스트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric 환경에서 <a href='https://sangseek.com/sangseeks/FragmentTransaction/ko'>FragmentTransaction</a>을 테스트하는 방법에 대해 자세히 설명드리겠습니다. --- Robolectric에서 FragmentTransaction 테스트 개요 Robolectric은 안드로이드 UI 컴포넌트(액티비티, 프래그먼트 등)를 JVM 환경에서 실행할 수 있게 해주는 테스트 프레임워크입니다. 이를 통해 실제 디바이스를 사용하지 않고도 프래그먼트 전환 코드를 검증할 수 있습니다. FragmentTransaction 테스트란, 프래그먼트를 추가하거나 교체(replace)하고 커밋하는 동작이 정상적으로 이루어지는지, 그리고 프래그먼트 매니저 상태가 의도한 대로 변화하는지를 확인하는 것입니다. --- Robolectric으로 FragmentTransaction 테스트하기 - 단계별 설명 1. 테스트용 액티비티 준비 대부분 FragmentTransaction은 `FragmentManager`에 바인딩된 액티비티나 `FragmentActivity` 내에서 이뤄집니다. 따라서 테스트에서는 `FragmentActivity`를 로드한 후 해당 액티비티에서 프래그먼트 매니저를 가져와야 합니다. ```java @RunWith(RobolectricTestRunner.class) public class MyFragmentTransactionTest { private FragmentActivity activity; @Before public void setUp() { activity = Robolectric.buildActivity(FragmentActivity.class) .create() .start() .resume() .get(); } } ``` 2. FragmentTransaction 실행하기 액티비티에서 `getSupportFragmentManager()`를 호출해 `FragmentManager`를 얻고, `beginTransaction()`으로 `FragmentTransaction` 객체를 만듭니다. 이후에 `add()`, `replace()`, `remove()` 등의 작업을 수행할 수 있습니다. ```java @Test public void testFragmentAdd() { FragmentManager fragmentManager = activity.getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); MyFragment fragment = new MyFragment(); transaction.add(R.id.fragment_container, fragment); transaction.commit(); // commit 이후에 즉시 반영하지 않기 때문에 <a href='https://sangseek.com/sangseeks/executePendingTransactions/ko'>executePendingTransactions</a>() 호출 권장 fragmentManager.executePendingTransactions(); // 검증 코드 작성... } ``` 3. FragmentTransaction 효과 검증하기 Transaction 커밋 후에는 `FragmentManager`가 프래그먼트를 적절히 관리하는지 확인합니다. 대표적으로 다음을 검사할 수 있습니다. - `<a href='https://sangseek.com/sangseeks/findFragmentById/ko'>findFragmentById</a>()`를 통해 적절한 프래그먼트 <a href='https://sangseek.com/sangseeks/인스턴스/ko'>인스턴스</a>가 추가되었는지 확인 - 프래그먼트가 작성한 뷰(View)가 실제로 액티비티 내에 포함되었는지 검사 (`getView()` 또는 `View` 상위 계층 검사) - 롤백되는 커밋(back stack) 동작을 테스트하는 경우 `popBackStack()` 동작 후 프래그먼트 상태 변경 여부 확인 ```java Fragment foundFragment = fragmentManager.findFragmentById(R.id.fragment_container); <a href='https://sangseek.com/sangseeks/assertNotNull/ko'>assertNotNull</a>(foundFragment); assertTrue(foundFragment instanceof MyFragment); View fragmentView = foundFragment.getView(); assertNotNull(fragmentView); ``` 4. `executePendingTransactions()` 호출하기 `commit()`은 <a href='https://sangseek.com/sangseeks/비동기적/ko'>비동기적</a>으로 트랜잭션을 실행하기 때문에 테스트 중에 즉시 상태 반영을 원한다면 `executePendingTransactions()`를 활용해야 합니다. 그래야 테스트 시점에 `FragmentManager`가 최신 상태를 반영합니다. --- 테스트 시 주의사항 - 테스트 환경 세팅 - Robolectric은 사용자 뷰(View)와 생명 주기를 로컬 JVM에서 <a href='https://sangseek.com/sangseeks/흉내/ko'>흉내</a> 내므로 액티비티 라이프사이클 메서드(`onCreate()`, `onResume()` 등)를 수동으로 호출하는 경우가 많습니다. - FragmentContainer 리소스 - 프래그먼트를 추가할 컨테이너(`R.id.fragment_container`)가 포함된 레이아웃을 액티비티에 지정해야 합니다. - 아니면 직접 뷰를 프로그램 동적으로 생성하여 테스트하는 방식을 써야 합니다. - AndroidX Fragment 사용 시 - 안드로이드X 프래그먼트를 사용할 경우 `FragmentActivity`와 `getSupportFragmentManager()`를 사용하세요. - 안드로이드 플랫폼 프래그먼트를 테스트한다면 `FragmentActivity`가 아닌 기본 액티비티와 `getFragmentManager()`를 써야 하고, 그에 맞는 테스트 준비를 해야 합니다. - 비동기 및 옵저버 동작 테스트 - 만약 프래그먼트 전환 후 이벤트가 비동기로 발생하거나 UI 업데이트가 뒤따르는 경우, `ShadowLooper.runUiThreadTasks()` 또는 `advanceTo()`와 같은 Robolectric 유틸리티를 써서 스케줄된 작업을 강제로 실행할 수 있습니다. --- 요약 - `FragmentActivity`를 Robolectric 환경에서 생성 - 액티비티의 `FragmentManager`로부터 `FragmentTransaction` 생성 - `add()` / `replace()` 등 트랜잭션 수행 후 `commit()` - `executePendingTransactions()`로 즉시 반영 - `findFragmentById()`로 프래그먼트가 붙었는지 검증 - 필요 시 프래그먼트 뷰 상태도 체크 이처럼 Robolectric을 활용하면 실제 기기 없이도 프래그먼트 전환과 관련된 로직을 상세히 검증할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기