상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Robolectric에서 Snackbar의 동작을 테스트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric에서 Snackbar의 동작을 테스트하려면 일반적인 안드로이드 뷰나 토스트와는 다르게 약간의 추가 작업이 필요합니다. Snackbar는 `CoordinatorLayout` 위에 `BaseTransientBottomBar`를 이용해 동적으로 뷰를 추가하고, 애니메이션과 타이머에 의해 자동으로 사라지는 특성이 있어서, 이를 그대로 테스트 프레임워크에서 재현하기 위해 몇 가지 고려할 점이 있습니다. 다음은 Robolectric 환경에서 Snackbar 동작을 효과적으로 테스트하는 방법과 팁입니다. --- 1. 기본적으로 Snackbar가 보여지는지 확인하기 Snackbar는 내부적으로 `Snackbar.SnackbarLayout` 뷰를 생성하여 현재 액티비티나 프래그먼트의 뷰 위에 추가합니다. Robolectric에서는 뷰 계층 구조를 직접 탐색하여 이 뷰가 존재하는지 확인하는 방법으로 동작을 검증할 수 있습니다. ```java // 의존뷰는 예를 들어 CoordinatorLayout이나 단순 View View parentView = activity.findViewById(R.id.coordinator_layout); // Snackbar 생성 및 보여주기 Snackbar snackbar = Snackbar.make(parentView, "Test Snackbar", Snackbar.LENGTH_SHORT); snackbar.show(); // Robolectric 스케줄러 실행: 애니메이션 및 핸들러 메시지 진행 Robolectric.flushForegroundThreadScheduler(); // 뷰 계층에서 SnackbarLayout을 찾음 ViewGroup rootView = (ViewGroup) parentView.getRootView(); boolean snackbarFound = false; for (int i = 0; i < rootView.getChildCount(); i++) { View child = rootView.getChildAt(i); if (child instanceof Snackbar.SnackbarLayout) { snackbarFound = true; break; } } // 검증 assertTrue(snackbarFound); ``` 이처럼 Snackbar가 실제 뷰 트리에 추가되었는지 여부를 테스트할 수 있습니다. --- 2. 텍스트 내용, 행동 버튼 등 Snackbar 내부 UI 확인하기 Snackbar 내부의 텍스트 `TextView`나 버튼 `Button`을 찾아 내용 검증도 가능합니다. ```java Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) rootView.getChildAt(indexOfSnackbar); TextView textView = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_text); assertEquals("Test Snackbar", textView.getText().toString()); Button actionButton = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_action); assertEquals("RETRY", actionButton.getText().toString()); ``` 이렇게 텍스트와 액션이 올바르게 <a href='https://sangseek.com/sangseeks/셋팅/ko'>셋팅</a>되었는지 확인할 수 있습니다. --- 3. Snackbar 애니메이션, 타이머 동작 테스트 Snackbar는 `LENGTH_SHORT`, `LENGTH_LONG` 등에 따라 자동으로 사라지지만, Robolectric에서는 기본적으로 이런 타이머나 애니메이션이 즉시 처리되지 않습니다. 따라서 아래 단계를 활용합니다. - `Robolectric.flushForegroundThreadScheduler()` 또는 `Robolectric.getForegroundThreadScheduler().advanceToLastPosted<a href='https://sangseek.com/sangseeks/Runnable/ko'>Runnable</a>()` 호출해 타이머 핸들러를 실행합니다. - 이를 통해 스낵바가 자동으로 사라지는 이벤트를 처리하고, 뷰가 제거되는 상황을 시뮬레이션할 수 있습니다. 예) ```java snackbar.show(); // 타이머가 동작하여 Snackbar가 사라져야 하는 시점까지 진행 Robolectric.getForegroundThreadScheduler().advanceBy(3500, TimeUnit.MILLISECONDS); // 이제 뷰 트리에서 SnackbarLayout이 사라졌는지 확인 boolean snackbarExists = false; for (int i = 0; i < rootView.getChildCount(); i++) { if (rootView.getChildAt(i) instanceof Snackbar.SnackbarLayout) { snackbarExists = true; break; } } assertFalse(snackbarExists); ``` --- 4. 액션 버튼 클릭 테스트 Snackbar에 설정한 액션 버튼 클릭도 테스트 가능하며, 이를 위해 액션 버튼을 찾아서 `performClick()` 호출하면 됩니다. ```java Button actionButton = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_action); assertNotNull(actionButton); // 액션이 정상 등록되었는지, AtomicBoolean clicked = new AtomicBoolean(false); snackbar.setAction("RETRY", v -> clicked.set(true)); actionButton.performClick(); assertTrue(clicked.get()); ``` 액션 람다가 정상 실행되는지 확인할 수 있습니다. --- 5. 팁 및 주의사항 - `Snackbar.make()`에 전달하는 뷰는 현재 화면에 표시된 뷰 계층에 있어야 동작이 정확합니다. - Robolectric의 특정 버전에서는 Material Components 라이브러리와의 호환성 문제로 Snackbar 구현이 다를 수 있으므로, 라이브러리 버전과 Robolectric 버전을 맞춰 사용하는 것이 좋습니다. - 애니메이션 관련 처리를 위해서 Robolectric의 스케줄러 제어를 잘 활용해야 합니다. - 테스트가 매우 까다로운 경우, Snackbar 노출 여부를 검증하는 대신 비즈니스 로직에서 Snackbar 호출 여부를 간접적으로 확인하도록 리팩토링할 수도 있습니다. --- 요약 Robolectric에서 Snackbar 동작 테스트는 다음과 같습니다: 1. `Snackbar.show()` 호출 후 뷰 트리에 `Snackbar.SnackbarLayout` 존재 여부 확인. 2. Snackbar 내부 텍스트, 액션 버튼 텍스트 등을 UI 트리에서 찾아 검증. 3. Robolectric 스케줄러로 타이머와 애니메이션을 진행시켜 자동 사라짐 동작 확인. 4. 액션 버튼 클릭 시 리스너가 올바르게 동작하는지 `performClick()`으로 테스트. 5. 필요 시 테스트 환경에 맞게 라이브러리 버전과 스케줄러 동작을 조정. 이 과정을 거치면 Robolectric에서도 Snackbar UI와 동작을 적절히 검증할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기