Robolectric에서 SharedPreferences를 접근하는 방법은 무엇인가요?
_____A1: Robolectric은 Android 프레임워크를 시뮬레이션하기 때문에, 실제 디바이스 없이도 SharedPreferences를 이용할 수 있습니다. 일반적으로는 `RuntimeEnvironment.application` 또는 테스트 중인 Context를 사용하여 SharedPreferences 객체를 얻습니다. 예를 들어:
```java
SharedPreferences prefs = RuntimeEnvironment.application.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
```
또는
```java
SharedPreferences prefs = ApplicationProvider.getApplicationContext().getSharedPreferences("pref_name", Context.MODE_PRIVATE);
```
Q2: Robolectric에서 SharedPreferences를 수정한 값을 테스트에서 바로 반영할 수 있나요?
A2: 네, SharedPreferences 편집 후 반드시 `apply()` 또는 `commit()`을 호출해야 변경사항이 반영됩니다. Robolectric 환경에서는 실제 디스크에 쓰지 않고 메모리 내에서 동작하기 때문에, 즉시 변경이 반영되어 테스트 시 확인이 가능합니다.
Q3: Robolectric 테스트 중에 기본 SharedPreferences를 얻는 방법은?
A3: `PreferenceManager.getDefaultSharedPreferences(context)`를 Robolectric 환경에서 호출해도 정상 동작합니다. 예:
```java
SharedPreferences defaultPrefs = PreferenceManager.getDefaultSharedPreferences(ApplicationProvider.getApplicationContext());
Q4: Robolectric로 SharedPreferences의 초기 상태를 설정하려면 어떻게 하나요?
A4: 테스트 시작 전에 `SharedPreferences.Editor`를 이용해 원하는 값을 미리 넣어 둘 수 있습니다. 예:
```java
SharedPreferences prefs = ApplicationProvider.getApplicationContext().getSharedPreferences("pref_name", Context.MODE_PRIVATE);
prefs.edit().putString("key", "value").commit();
```
Q5: Robolectric과 실제 디바이스의 SharedPreferences 동작 차이가 있나요?
A5: Robolectric은 SharedPreferences를 메모리 내 구현으로 대체하므로 파일 시스템에 저장되지 않고 테스트 세션 동안만 유지됩니다. 따라서 앱을 재시작하는 시뮬레이션을 하려면 SharedPreferences 객체를 다시 얻어야 하며, 실제 파일 동기화는 하지 않습니다.
Q6: AndroidX Test 대신 Robolectric에서 SharedPreferences 테스트시 권장되는 방법은?
A6: AndroidX Test는 에뮬레이터나 실제 디바이스에서 동작하며, Robolectric은 JVM 환경에서 빠른 단위 테스트용입니다. Robolectric에서는 위에 설명한 ApplicationProvider나 RuntimeEnvironment.application을 통해 콘텍스트를 얻어 SharedPreferences에 접근하는 것이 일반적입니다.
---
정리하면, Robolectric에서는 `ApplicationProvider.getApplicationContext()` 또는 `RuntimeEnvironment.application`을 통해 Context를 얻고, 이 Context에서 `getSharedPreferences()` 또는 `PreferenceManager.getDefaultSharedPreferences()`를 호출해 SharedPreferences를 얻고 사용할 수 있습니다. 수정된 값은 즉시 반영되며, 테스트 내에서 자유롭게 읽고 쓸 수 있습니다.
SharedPreferences 또한 Robolectric에서 사용할 수 있는데, 접근 방법은 실제 안드로이드 환경과 아주 유사하지만, Robolectric이 내부적으로 인메모리 방식으로 동작하기 때문에 테스트가 빠르게 수행됩니다.
Robolectric에서 SharedPreferences 접근하기 1. Context 얻기 Robolectric 테스트에서는 `ApplicationProvider.getApplicationContext()` 메서드를 이용해 테스트용 `Context`를 얻을 수 있습니다.
```java Context context = ApplicationProvider.getApplicationContext(); ```
2. SharedPreferences 인스턴스 가져오기 `Context`의 `getSharedPreferences()` 메서드로 `SharedPreferences` 인스턴스를 얻을 수 있습니다.
```java SharedPreferences sharedPreferences = context.getSharedPreferences("test_prefs", Context.MODE_PRIVATE); ```
3. 값 저장 및 읽기 일반 안드로이드 환경과 동일하게 `edit()`를 이용해 값을 저장하고, `getXXX` 메서드를 이용해 값을 읽습니다.
```java sharedPreferences.edit().putString("key", "value").commit(); String value = sharedPreferences.getString("key", null); ``` Robolectric에 특화된 점 - In-memory 동작 Robolectric은 SharedPreferences 작업을 실제 파일로 저장하지 않고 메모리 내에 저장하므로, 테스트 후 상태가 유지되지 않으며 빠른 실행이 가능합니다.
- State Reset 각 테스트 실행 시 Robolectric이 `Context`와 SharedPreferences를 초기화하므로, 별도의 클린업 코드 없이 독립적인 테스트가 가능합니다.
예제 코드 (JUnit4 기준) ```java @RunWith(RobolectricTestRunner.class) public class SharedPreferencesTest { @Test public void testSharedPreferences() { Context context = ApplicationProvider.getApplicationContext(); SharedPreferences prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE); // 값 저장 prefs.edit().putString("username", "roboUser").commit(); // 값 읽기 String username = prefs.getString("username", null); // 검증 assertEquals("roboUser", username); } } ``` 추가 팁 - `commit()` 대신 `apply()`를 호출해도 무방하며, Robolectric 내부적으로 즉시 적용됩니다.
- `PreferenceManager.getDefaultSharedPreferences(context)`를 사용해 기본 SharedPreferences도 테스트할 수 있습니다.
- Robolectric 버전에 따라 세부 동작이 다를 수 있으니, 사용 중인 Robolectric의 공식 문서나 GitHub 이슈를 참고하는 것이 좋습니다.
--- Robolectric에서 SharedPreferences를 접근할 때는 기본적인 안드로이드 방식과 동일하게 `ApplicationProvider.getApplicationContext()`를 통해 받은 `Context`에서 `getSharedPreferences()`를 호출해 사용하면 되고, Robolectric이 메모리 기반으로 동작하므로 테스트 실행이 빠르고 독립적입니다.
작성자:
김수호 [비회원]
| 작성일자: 1년 전
2025-05-26 03:51:29
조회수: 191 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 191 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.