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 프레임워크 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
조회수: 171 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.