2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Robolectric에서 External Storage에 접근하여 테스트하는 방법은 무엇인가요?

_____
Q1: Robolectric에서 External Storage에 접근할 수 있나요?
A1: 네, Robolectric은 기본적으로 Android의 외부 저장소 API를 시뮬레이션합니다. 테스트 시 실제 디바이스의 외부 저장소가 아닌 가상의 파일 시스템을 사용하여 테스트를 진행합니다.

---

Q2: Robolectric 테스트 내에서 외부 저장소 경로를 어떻게 얻나요?
A2: `Environment.getExternalStorageDirectory()` 또는 `ApplicationProvider.getApplicationContext().getExternalFilesDir()` 같은 표준 Android API를 사용할 수 있습니다. Robolectric이 이를 가상의 경로로 매핑하여 반환합니다.

```java
File externalDir = Environment.getExternalStorageDirectory();
```

또는

```java
File externalFilesDir = ApplicationProvider.getApplicationContext().getExternalFilesDir(null);
```

---

Q3: 외부 저장소에 파일을 생성하거나 읽는 테스트는 어떻게 하나요?
A3: Robolectric은 내부적으로 가상의 외부 저장소 디렉토리를 제공하므로, 표준 File 입출력 API를 그대로 사용하면 됩니다. 예:

```java
File externalFile = new File(Environment.getExternalStorageDirectory(), "test.txt");
try (FileWriter writer = new FileWriter(externalFile)) {
writer.write("Hello Robolectric!");
}

assertTrue(externalFile.exists());
```

---

Q4: SDK 버전에 따른 외부 저장소 접근 권한 문제는 어떻게 처리하나요?
A4: Robolectric에서는 권한 요청 및 승인 과정을 수동으로 모킹하거나 추가 설정이 필요할 수 있습니다. 테스트 내에서 권한이 있다고 가정하거나, 필요한 경우 `ShadowApplication` 등에서 권한 상태를 조작하세요.

---

Q5: Robolectric 외부 저장소의 실제 경로는 어디인가요?
A5: Robolectric이 사용하는 외부 저장소 경로는 실제 파일 시스템 내 임시 디렉토리이며, 일반적으로 `build/` 디렉토리 하위의 `robolectric` 폴더 등 테스트 환경에 따라 달라집니다. 경로 확인이 필요하면 테스트 중에 경로를 출력해보면 됩니다.

---

Q6: 외부 저장소를 초기화하거나 정리하려면 어떻게 하나요?
A6: 테스트마다 가상 외부 저장소 디렉토리를 클리어하거나 생성하려면, JUnit의 `@Before` 및 `@After` 메소드를 활용하여 해당 디렉토리를 삭제 또는 초기화하세요.

```java
@Before
public void setUp() {
File externalDir = Environment.getExternalStorageDirectory();
if (externalDir.exists()) {
// 삭제 코드 작성
}
externalDir.mkdirs();
}
```

---

Q7: AndroidManifest.xml에서 외부 저장소 권한을 테스트에 반영하려면?
A7: Robolectric 테스트에서는 `@Config` 어노테이션을 통해 원하는 manifest 파일을 지정하거나, gradle 빌드 시 생성되는 매니페스트를 사용합니다. 외부 저장소 권한(`WRITE_EXTERNAL_STORAGE`, `READ_EXTERNAL_STORAGE`)이 manifest에 선언되어 있어야 정상 동작을 보장합니다.

---

요약 : Robolectric에서는 표준 Android API를 통해 외부 저장소 접근 코드를 작성하면, 내부적으로 가상의 파일 시스템에서 테스트가 수행됩니다. 권한 처리 및 초기화 관련 추가 작업만 적절히 해주면 외부 저장소 접근에 대한 테스트를 문제없이 진행할 수 있습니다.
Robolectric으로 Android 외부 저장소(External Storage)에 접근해 테스트를 진행하려면, 실제 디바이스나 에뮬레이터의 외부 저장소를 직접 사용하는 대신 Robolectric이 제공하는 가상 환경 내에서 외부 저장소 동작을 시뮬레이트해야 합니다.

Robolectric은 기본적으로 Android 프레임워크 API를 JVM 환경에서 구현해주지만, 외부 저장소 경로나 파일 접근 등은 실제 파일 시스템과 다르게 동작하므로 별도의 설정과 처리가 필요합니다.

다음은 Robolectric에서 External Storage 접근 및 테스트 방법에 대한 주요 포인트와 절차입니다.

1. Robolectric 가상 외부 저장소 설정 이해 - Robolectric은 기본적으로 외부 저장소 경로를 `RuntimeEnvironment.getExternalStorageDirectory()` 등의 메서드를 통해 반환하지만, 이는 실제 디바이스의 외부 저장소가 아니라 JVM 가상 환경 내 임시 폴더입니다.

- 테스트 실행 시 `RuntimeEnvironment.getExternalStorageDirectory()`가 가리키는 경로는 보통 `build/tmp/robolectric` 하위 폴더나 OS 임시 폴더이며, 실제 외부 저장소가 아니므로 테스트 중 파일 생성, 읽기, 쓰기가 가능하다.

2. 테스트에서 외부 저장소 접근 코드를 작성할 때 주의할 점 - 기존 앱 코드가 `Environment.getExternalStorageDirectory()`나 `context.getExternalFilesDir()` 등을 통해 경로를 얻는다면, Robolectric 환경에서 호출시 기본 경로가 JVM임시폴더로 맵핑된다. - 따라서 외부 저장소에 파일을 생성하거나 읽는 코드를 작성하면, 테스트 중에도 정상적으로 파일 IO가 가능하다. - 다만, Android 10(Q) 이상의 Scoped Storage 정책이나 외부 저장소 접근 권한, MediaStore API 접근 등은 Robolectric에서 완벽하게 재현되지 않을 수 있으므로, 가능하면 외부 저장소 접근 부분을 분리해서 별도 테스트 하거나, Mockito 등으로 의존성 주입 해 대체하는 방식도 검토한다.



3. 실제 테스트 예시 다음은 Robolectric를 이용해 외부 저장소에 파일을 생성하고 읽는 아주 간단한 테스트 예시다. ```java @RunWith(RobolectricTestRunner.class) @Config(sdk = {28}) // Android 버전 설정 public class ExternalStorageTest { @Test public void testWriteAndReadFileInExternalStorage() throws Exception { // 외부 저장소 경로 얻기 (Robolectric 가상 경로) File externalDir = Environment.getExternalStorageDirectory(); assertNotNull(externalDir); File testDir = new File(externalDir, "testDir"); if (!testDir.exists()) { testDir.mkdirs(); } File testFile = new File(testDir, "testFile.txt"); String testData = "Hello External Storage!"; // 파일에 쓰기 try (FileOutputStream fos = new FileOutputStream(testFile)) { fos.write(testData.getBytes()); } // 파일 존재 여부 확인 assertTrue(testFile.exists()); // 파일 읽기 String readData; try (FileInputStream fis = new FileInputStream(testFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr)) { readData = br.readLine(); } // 쓰고 읽은 값 검증 assertEquals(testData, readData); } } ``` 이 테스트는 실제 외부 저장소에 접근하는 것이 아니라 Robolectric이 JVM 내에 생성해준 가상 폴더에 파일을 만들고 읽는 테스트다. 따라서 실제 디바이스나 에뮬레이터 외부 저장소와는 분리된 독립적인 테스트가 가능하다.

4. `@Config` 활용 및 외부 저장소 권한 핸들링 - Robolectric 테스트는 `@Config`를 이용해 SDK 버전을 지정할 수 있는데, 실제 앱에서 권한 요청이나 Scoped Storage 여부에 따라 달라지는 동작을 재현할 때 유용하다. - 외부 저장소 권한(`WRITE_EXTERNAL_STORAGE`, `READ_EXTERNAL_STORAGE`)은 Robolectric 내에서 실제 권한 처리가 안 되므로, 권한 체크나 요청 여부 관련 코드는 Mockito 등으로 Mock 처리하는 것이 일반적이다.



5. 외부 저장소 경로 커스터마이징 - 필요시 Robolectric 세팅 시 `@Config`의 shadows 속성에 외부 저장소 경로를 분리하거나 커스텀 Shadow 클래스를 만들어 경로를 다른 위치로 지정할 수 있다.

- 그러나 일반적인 경우 기본 Robolectric 외부 저장소 경로를 사용하는 것이 편리하다. - Robolectric은 실제 외부 저장소가 아닌 JVM 내 임시경로를 외부 저장소로 제공한다.

- `Environment.getExternalStorageDirectory()` 등 API 호출시 가상 폴더 경로가 리턴되어, 해당 위치에 파일을 생성하고 읽는 테스트 코드를 작성 가능하다. - 외부 저장소 권한, Scoped Storage 등 복잡한 시스템 의존 로직은 Robolectric만으로 완벽 시뮬레이션이 어려워 의존성 분리나 목킹(mocking)이 권장된다. - 필요한 경우 `@Config`로 SDK 버전 설정, Shadow 클래스 제작 등을 통해 테스트 환경을 세밀히 조정할 수 있다.

이러한 방법으로 Robolectric에서 외부 저장소 접근 관련 테스트를 구현하면, 실제 디바이스나 에뮬레이터 없이도 JVM환경에서 안정적이고 빠르게 저장소 관련 코드를 검증할 수 있다.

작성자: 김유리 [비회원] | 작성일자: 1년 전 2025-05-26 03:51:45
조회수: 171 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.