프로그래밍/Android

Android JUnit - app의 resource에 접근하기

freemmer 2016. 8. 11. 20:28

Android JUnit - app의 resource에 접근하기

google이 eclipse에 대한 지원을 중단함에 따라 Android 개발자들이 이제는 Android Studio로 많이 개발을 하고 있습니다.
특히 github에 올라오는 소스들도 Android Studio 프로젝트가 많아지고 있는데요, 어느센가 Android Studio에서 프로젝트를 생성하면 androidTest외에 JUnit을 사용하는 test라는 것이 같이 생성되더군요.


전 개인적으로 ‘기능 테스트’는 JUnit으로 (test) ‘시나리오 테스트’는 AndroidTestCase (androidTest)로 합니다.

Case : JUint(test)에서 app의 res/raw의 xml파일을 읽어야 한다.

androidTest에서는 아래와 같은 코드로 resource의 raw에 접근할 수 있습니다.
public class TestReadResRaw() {
public void testReadRaw() {
getContext().getResources().openRawResource(R.raw.board_pattern01);
}
}
하지만 JUnit에서는 Context를 얻어오지 못합니다. 그래서 JUnit에서는 위와 같은 코드로 resource에 접근할 수 없습니다.
이 경우 해결 방법은 다음과 같습니다.
  1. 테스트 실행시 app의 리소스를 build의 class에 복사한다.
  2. ClassLoader를 이용해 파일을 직접 읽는다.
이것을 위해 build.gradle에 다음을 추가합니다.
android {
...
}
task copyResDirectoryToClasses(type: Copy){
from "${projectDir}/src/main/res"
into "${buildDir}/intermediates/classes/test/debug/res"
}
//assembleDebug.dependsOn(copyResDirectoryToClasses)
preBuild.dependsOn(copyResDirectoryToClasses)
코드를 보시면 느낌이 오실겁니다.
app의 리소스를 build의 class에 복사하는 gradle task(copyResDirectoryToClasses)를 만들고, preBuild task의 의존성 task에 등록을 합니다. (꼭 preBuild task에 할 필요는 없고 적당한 task에 등록 하시면 됩니다)
JUnit에서는 아래와 같은 코드로 파일에 접근하여 읽어올 수 있습니다.
public class AppResourceReadTest() {
private static File getFileFromPath(Object obj, String fileName) {
ClassLoader classLoader = obj.getClass().getClassLoader();
URL resource = classLoader.getResource(fileName);
return new File(resource.getPath());
}
@Test
public void fileObjectShouldNotBeNull() throws Exception {
File file = getFileFromPath(this, "res/raw/board_pattern01.xml");
assertNotNull(file);
}
}


반응형