Robolectric에서 PreferenceActivity를 테스트하는 방법은 무엇인가요?
_____네, Robolectric을 사용하면 PreferenceActivity나 PreferenceFragment를 포함하는 환경을 에뮬레이션하여 유닛 테스트할 수 있습니다.
---
Q2: PreferenceActivity 테스트 시 Robolectric 환경 설정은 어떻게 하나요?
- `@RunWith(RobolectricTestRunner.class)` 어노테이션을 사용합니다.
- `@Config` 어노테이션으로 필요한 SDK 버전이나 빌드 설정을 맞춰줍니다.
- AndroidManifest.xml에 PreferenceActivity가 선언되어 있어야 합니다.
```java
@RunWith(RobolectricTestRunner.class)
@Config(sdk = Build.VERSION_CODES.P)
public class MyPreferenceActivityTest {
// 테스트 코드
}
```
---
Q3: PreferenceActivity 인스턴스는 어떻게 생성하나요?
`Robolectric.buildActivity()`를 사용하여 인스턴스를 만들고 액티비티 생명주기 메서드를 호출합니다.
```java
PreferenceActivity activity = Robolectric.buildActivity(MyPreferenceActivity.class)
.create()
.start()
.resume()
.get();
```
---
Q4: Preference 화면에 접근하는 방법은 무엇인가요?
PreferenceActivity 내부에 `getPreferenceScreen()` 메서드로 PreferenceScreen 객체를 얻을 수 있습니다. 이를 통해 개별 Preference 설정이나 상태를 확인할 수 있습니다.
```java
PreferenceScreen screen = activity.getPreferenceScreen();
Preference myPref = screen.findPreference("preference_key");
assertNotNull(myPref);
```
---
Q5: PreferenceFragment를 사용하는 경우는 어떻게 테스트하나요?
- FragmentScenario이나 직접 Fragment를 인스턴스화 하여 테스트 가능하며, `FragmentController`를 써서 생명주기를 제어할 수 있습니다.
```java
MyPreferenceFragment fragment = Robolectric.buildFragment(MyPreferenceFragment.class)
.create()
.start()
.resume()
.visible()
.get();
PreferenceScreen screen = fragment.getPreferenceScreen();
```
---
Q6: Preference 변경 이벤트를 테스트하는 방법은?
`OnPreferenceChangeListener` 또는 `OnPreferenceClickListener`를 설정한 후, 직접 해당 Preference의 값 변경 메서드를 호출하거나, `callChangeListener()` 등을 호출해 이벤트가 잘 발생하는지 확인할 수 있습니다.
```java
Preference myPref = screen.findPreference("key");
boolean handled = myPref.callChangeListener(newValue);
assertTrue(handled);
```
---
Q7: Preference 내 저장된 SharedPreferences 데이터를 테스트하려면?
Robolectric은 자체 내장된 `ShadowPreferenceManager`를 통해 SharedPreferences 동작도 지원합니다. 액티비티 컨텍스트의 SharedPreferences를 직접 가져와 값 검사도 가능합니다.
```java
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
String value = prefs.getString("preference_key", null);
assertEquals("expectedValue", value);
```
---
Q8: Robolectric에서 PreferenceActivity를 테스트할 때 주의할 점은?
- AndroidX Preference 라이브러리를 사용할 경우 PreferenceFragmentCompat를 사용하는데, Robolectric 버전과 호환 여부를 확인해야 합니다.
- API 레벨에 따라 Preference 화면 동작이 다를 수 있으니 `@Config(sdk = ...)`로 테스트 대상 SDK를 명시하는 게 좋습니다.
- UI 컴포넌트 검증보다는 Preference 동작과 저장 상태 검증 위주로 테스트하는 것이 효과적입니다.
---
요약:
Robolectric에서는 `buildActivity()` 또는 `buildFragment()` API를 사용해서 PreferenceActivity/PreferenceFragment를 생성하고, `getPreferenceScreen()` 등을 이용해 내부 Preference를 접근할 수 있습니다. SharedPreferences 상태 검사와 Preference 이벤트 호출도 지원하므로, Preference 화면과 설정 기능에 대한 단위 테스트를 작성할 수 있습니다.
일반적인 Activity나 Fragment는 Robolectric으로 쉽게 테스트할 수 있지만, PreferenceActivity나 PreferenceFragment는 별도의 설정이나 주의가 필요합니다.
특히 PreferenceActivity는 기본적으로 설정 스크린을 구성하는데, Preference XML 리소스를 로드하고, 그 안의 Preference 객체를 조작하며 상태를 검증하는 방식으로 테스트하게 됩니다.
아래는 Robolectric에서 PreferenceActivity를 테스트하는 구체적인 접근 방법과 팁을 정리한 내용입니다.
1. PreferenceActivity, PreferenceFragment 구조 이해하기 - `PreferenceActivity` 는 안드로이드에서 설정 화면용 액티비티입니다.
- 보통 API 레벨에 따라 `PreferenceFragment` 또는 `PreferenceFragmentCompat`을 같이 사용합니다.
- Preference들은 XML 리소스(예: `R.xml.preferences`)로 정의하고, `addPreferencesFromResource()` 같은 메서드로 로드합니다.
---
2. Robolectric 테스트 클래스 준비 - 테스트는 JUnit 4 스타일로 작성합니다.
- `@RunWith(RobolectricTestRunner.class)`를 붙여 Robolectric 테스트임을 명시합니다.
- SDK 버전은 `@Config` 어노테이션으로 지정 가능하며, 로컬 환경에 맞춰 설정합니다.
```java @RunWith(RobolectricTestRunner.class) @Config(sdk = Build.VERSION_CODES.P) // 예: API 28 public class MyPreferenceActivityTest { // ... } ``` ---
3. PreferenceActivity 인스턴스 생성 및 생명주기 실행 - Robolectric의 `Robolectric.buildActivity()` 메서드를 사용해 액티비티 인스턴스를 생성하고 `create()`, `start()`, `resume()` 같은 라이프사이클 메서드를 호출해 실제 동작하는 환경을 만듭니다.
```java MyPreferenceActivity activity = Robolectric.buildActivity(MyPreferenceActivity.class) .create() .start() .resume() .get(); ``` - 이렇게 해야 `onCreate()` 내에서 `addPreferencesFromResource()` 실행되고, Preference 화면이 초기화됩니다.
---
4. Preference 객체 접근 및 검증 방법 - `PreferenceActivity`에서 `getPreferenceScreen()` 메서드를 이용해 `PreferenceScreen` 객체를 얻고, 그 아래 `Preference`들을 계층적으로 조회합니다.
- 각 Preference를 key 값을 통해 `findPreference("key")`로 가져올 수 있습니다.
예시: ```java PreferenceScreen screen = activity.getPreferenceScreen(); Preference preference = screen.findPreference("example_key"); ``` - 혹은 직접 액티비티 내 `findPreference()` 메서드를 호출해도 됩니다.
---
5. Preference 클릭 및 상태 변경 시뮬레이션 - Preference 클릭은 `Preference.performClick()` 메서드를 이용해 시뮬레이트할 수 있습니다.
- Preference 상태(예: CheckBoxPreference 체크 여부)는 직접 조작하거나 `getSharedPreferences()`로 읽어서 검증합니다.
- 만약 preference 변경에 따른 이벤트 처리 로직이 있다면, 클릭 후 그 동작이 제대로 수행됐는지 검증하는 통합테스트도 가능합니다.
예: ```java CheckBoxPreference checkBoxPref = (CheckBoxPreference) preference; assertFalse(checkBoxPref.isChecked()); checkBoxPref.performClick(); assertTrue(checkBoxPref.isChecked()); ``` ---
6. PreferenceManager, SharedPreferences 초기화 (필요 시) - 테스트가 실행될 때 SharedPreferences가 초기화되지 않아 Preference 상태가 꼬일 수 있습니다.
- `PreferenceManager.setDefaultValues()` 를 테스트 시작 전에 호출하거나, - `ShadowPreferenceManager.reset()` (Robolectric 내 설정 관리 Shadow 객체 활용)을 이용해 초기 상태를 맞출 수 있습니다.
---
7. PreferenceFragment / PreferenceFragmentCompat 테스트 - 만약 `PreferenceActivity` 대신 `PreferenceFragment`를 쓰는 구조라면, - Robolectric에서 `FragmentController`를 이용해 프래그먼트를 생성 및 생명주기 호출하는 방식으로 진행합니다.
```java PreferenceFragment fragment = new MyPreferenceFragment(); FragmentController
---
8. 주의사항 및 팁 - Robolectric은 완벽한 에뮬레이터는 아니므로, 특별히 커스텀 Preference 또는 복잡한 UI는 실제 디바이스에서 검증도 병행해야 합니다.
- Preference XML 내 불필요한 네임스페이스 문제, 아이디 충돌, 최신 API 호환성을 주의합니다.
- `PreferenceActivity`는 API 레벨에 따라 지원 및 사용 방법이 달라질 수 있으므로 빌드 타겟과 테스트 SDK 버전을 일치시키는 게 좋습니다.
- `AppCompat` 라이브러리 사용 시, `PreferenceFragmentCompat`와 함께 테스트 하는 게 더 현대적인 방법입니다.
--- 요약 - Robolectric 테스트 내에서 `PreferenceActivity`를 `buildActivity()`로 생성하고, 생명주기 메서드 호출해 초기화. - `getPreferenceScreen()` 또는 `findPreference()`로 xml에 정의한 Preference 객체 접근. - `performClick()` 등으로 사용자 인터랙션 모방. - `SharedPreferences` 상태 확인 또는 직접 Preference 속성 검증. - 복잡할 경우 `PreferenceFragment`의 경우엔 `FragmentController`를 이용해 프래그먼트 생명주기 호출. - SDK 버전, 라이브러리 호환성을 체크. ---- 이렇게 하면 Robolectric 환경에서 `PreferenceActivity` 기반 설정 화면 로직을 효과적으로 단위 테스트할 수 있습니다.
작성자:
최민수 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:46
조회수: 135 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 135 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.