상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - Robolectric에서 커스텀 뷰를 테스트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric은 Android U<a href='https://sangseek.com/sangseeks/I 컴포넌트/ko'>I 컴포넌트</a>를 JVM 환경에서 테스트할 수 있게 해주는 프레임워크로, 실제 디바이스나 에뮬레이터 없이도 빠른 단위 테스트가 가능합니다. 커스텀 뷰(custom view)를 Robolectric으로 테스트할 때도 기본적으로 Android 뷰 테스트와 비슷한 방식이지만, 뷰의 생성, 속성 설정, 측정(measure), 레이아웃(layout), 그리고 동작 검증에 중점을 둬야 합니다. 다음은 커스텀 뷰 테스트 시 일반적인 절차와 고려사항을 자세히 설명한 내용입니다. --- 1. Robolectric 환경 설정 우선 Robolectric 테스트 클래스가 제대로 실행되도록 `build.gradle`에 Robolectric 의존성을 추가해야 합니다. ```gradle testImplementation "org.robolectric:robolectric:4.9" ``` 그리고 테스트 코드는 보통 `@RunWith(RobolectricTestRunner.class)` 어노테이션으로 실행하도록 합니다. ```java @RunWith(RobolectricTestRunner.class) public class CustomViewTest { // 테스트 메서드 작성 } ``` --- 2. 커스텀 뷰 인스턴스 생성 커스텀 뷰는 일반적으로 컨텍스트를 필요로 하므로 테스트에서는 `RuntimeEnvironment.application` 또는 `ApplicationProvider.getApplicationContext()` (AndroidX Test 기준)를 이용해 컨텍스트를 전달합니다. ```java Context context = ApplicationProvider.getApplicationContext(); MyCustomView customView = new MyCustomView(context); ``` 만약 XML에서 인플레이트 하도록 설계된 뷰라면, `AttributeSet`을 생성해서 생성자에 전달할 수도 있지만, 보통 단위 테스트에서는 인스턴스 생성 후 필요한 속성을 직접 설정하는 경우가 많습니다. --- 3. 뷰 속성 및 상태 설정 만약 커스텀 뷰에 setters 또는 public 프로퍼티가 있다면, 테스트 목적에 따라 적절히 값을 설정합니다. ```java customView.setSomeProperty(value); ``` 또는, `TypedArray` 기반 `AttributeSet`을 흉내내야 할 경우 Mockery를 쓰기도 하지만, 보통은 실제 XML 파싱을 하지 않고 코드로 원하는 상태를 만들어 줍니다. --- 4. 뷰 측정 및 레이아웃 호출 커스텀뷰는 `onMeasure()`, `onLayout()`, `onDraw()` 등에서 동작이 결정되므로, 테스트 과정에서 이 메서드들이 호출되도록 강제할 필요가 있습니다. ``` int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(1080, View.MeasureSpec.EXACTLY); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(1920, View.MeasureSpec.EXACTLY); customView.measure(widthMeasureSpec, heightMeasureSpec); customView.layout(0, 0, customView.getMeasuredWidth(), customView.getMeasuredHeight()); ``` 이 과정을 통해 뷰는 화면에 그려질 준비가 되며, `onDraw()` 호출을 명시적으로 하지 않아도 Robolectric 환경에서 해당 뷰의 내부 상태를 테스트할 수 있습니다. --- 5. 뷰 동작 검증 - 상태/속성 확인: 원하는 상태에 맞는 프로퍼티 값을 직접 검증합니다. - 버튼 클릭/터치 이벤트 시뮬레이션: 클릭 이벤트 같은 경우 `performClick()` 메서드를 호출해 시뮬레이션할 수 있습니다. - 메서드 호출 여부 및 <a href='https://sangseek.com/sangseeks/결과 검증/ko'>결과 검증</a>: 특정 메서드가 호출됐는지 `Mockito` 등을 컨비네이션해서 확인하거나, 메서드 결과를 검증합니다. - 뷰에 그려지는 텍스트나 이미지 확인: 뷰 내부에서 `onDraw()` 시 특정 텍스트가 그려지는지 테스트하려면, Robolectric에서 제공하는 ShadowView 기능을 사용하거나, 필요한 필드를 직접 접근해 검증해야 합니다. ```java customView.performClick(); assertTrue(customView.isClicked()); // 예시 ``` --- 6. XML 레이아웃에서 인플레이트하여 테스트하기 (Optional) 커스텀 뷰를 포함하는 레이아웃 XML을 가지고 테스트하고 싶다면 다음과 같이 할 수 있습니다. ```java LayoutInflater inflater = LayoutInflater.from(context); View root = inflater.inflate(R.layout.your_layout_with_custom_view, null); MyCustomView customViewFromXml = root.findViewById(R.id.custom_view_id); ``` 이 방식은 커스텀 뷰가 XML 속성을 제대로 해석하는지 테스트할 때 유용합니다. --- 7. 주의사항 및 팁 - Robolectric 버전에 따른 차이: 버전마다 지원하는 Android API 레벨과 기능이 다르므로, 테스트 하려는 뷰가 사용하는 API가 Robolectric에서 지원되는지 확인하세요. - 하드웨어 가속 그래픽 테스트 불가: 실제 Canvas 그리기 같은 경우 Robolectric은 제한적입니다. 이미지나 실제 렌더링이 중요한 로직은 UI 테스트(예: Espresso)로 보완이 필요합니다. - Context 및 Resources 사용 주의: Context 의존적인 작업(예: 리소스 접근, 스타일 속성 읽기)은 Robolectric이 제공하는 가짜 Context에서는 약간 다르게 동작할 수 있으므로, 테스트 환경에서 정상 작동하는지 확인해야 합니다. - 테스트 격리: 커스텀 뷰 내부에서 비동기 작업이나 외부 의존이 있으면 별도 mocking 또는 슬로우 테스트가 될 수 있으니, 빠른 단위 테스트 관점에서 단순화하는 게 좋습니다. --- 간단 예제 코드 (자바 기준) ```java @RunWith(RobolectricTestRunner.class) public class MyCustomViewTest { private MyCustomView customView; @Before public void setUp() { Context context = ApplicationProvider.getApplicationContext(); customView = new MyCustomView(context); } @Test public void testCustomView_initialState() { int widthSpec = View.MeasureSpec.makeMeasureSpec(500, View.MeasureSpec.EXACTLY); int heightSpec = View.MeasureSpec.makeMeasureSpec(300, View.MeasureSpec.EXACTLY); customView.measure(widthSpec, heightSpec); customView.layout(0, 0, customView.getMeasuredWidth(), customView.getMeasuredHeight()); assertEquals(500, customView.getMeasuredWidth()); assertEquals(300, customView.getMeasuredHeight()); assertFalse(customView.isSomeFlagSet()); } @Test public void testCustomView_clickChangesState() { customView.performClick(); assertTrue(customView.isSomeFlagSet()); } } ``` --- 요약 - Robolectric 환경에서 커스텀 뷰 테스트하려면 컨텍스트에서 뷰를 생성한다. - 뷰를 `measure()` → `layout()` 순서로 호출해 뷰 상태를 준비한다. - `performClick()` 등 이벤트 시뮬레이션 메소드로 동작을 트리거한다. - 내부 상태, 프로퍼티, 결과 값을 assert로 검사한다. - 필요하면 XML 레이아웃 인플레이트하여 테스트 가능하다. - Robolectric 그래픽 및 최신 API 지원에는 한계가 있으므로 완전한 UI 테스트는 별도로 한다. 위 과정을 따르면 Robolectric을 활용해 커스텀 뷰의 기본 동작과 상태를 효과적으로 단위 테스트할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기