2010-05-21 5 views
1

SAX 파싱을 수행하고 객체를 생성하는 클래스를 단위 테스트하려고합니다. 이 클래스는 문자열을 인터넷에서 문서의 URL을 나타내는 매개 변수로 사용하여 구문 분석 한 다음 내용을 기반으로 개체를 만듭니다.단위 테스트를 할 수 있도록 내 수업을 리팩토링하는 방법은 무엇입니까?

단위 테스트를 실제로 네트워크에 액세스하고 싶지 않으므로 구문 분석 할 몇 가지 테스트 XML 파일을 갖고 싶습니다. 그러나 내 AndroidTestCases에서 액세스하는 방법을 알아낼 수 없습니다. 실제 응용 프로그램에 테스트 파일을 포함하고 싶지는 않지만 테스트 프로젝트에 필요합니다. (별개의 프로젝트입니다. 사용자 정의 AndroidManifest가 있어야하므로 수집 할 수있는 Android 테스트의 표준입니다. .xml, 하나).

한 가지 방법은 XML 파일을 테스트 프로젝트의 assets 디렉토리에 넣고 테스트 케이스의 InputStreamgetContext().getAssets().open(filename을 사용하여 읽을 수 있지만 내 클래스에는 URL 문자열이 필요합니다. 차라리 현재 URL 문자열 대신이 클래스에 InputStream을 제공하지 않아도됩니다. 나는 파싱을 테스트 할 수 있습니다. 하나는 문자열을 취하고 다른 하나는 Inputstream을 테스트하고 두 번째는 테스트하는 방법입니다.하지만 어떻게 문자열을 취하는 지 테스트 할 수 있습니까?

이 문제를 피하기 위해 클래스 및 테스트를 어떻게 디자인해야합니까?

답변

0

당신은 의존성 주입과 함께 가고 싶습니다. 내가 읽은 것을 바탕으로, 당신이 메서드 서명과 같이 있습니다

string -> object // using lambda notation 

그것은 당신이 당신이 요구하고 동일한 방법으로 존재하는 URL의 내용을 얻기 위해이 코드처럼 들린다. 이를 별도의 객체로 리팩터링해야합니다. 그런 다음 네트워크 액세스를 수행하는 대신 필요한 매개 변수를 사용하여 디스크에 파일 작업을 수행하는 대신 테스트 용 모의 객체를 만들 수 있습니다. 테스트 환경에서는 테스트 설정에서 실제 네트워크 getter 객체 대신 mock 객체를 주입합니다.

이 방법은 구문 분석 할 텍스트가 XHTML 또는 XML이면 반환하는 한 어떤 개체가 있는지 신경 쓰지 않습니다.

+0

이러한 접근 방식과 클래스가 문자열 대신 InputStream을 허용하도록 만드는 차이점은 무엇입니까? 단지 간접비를 추가하는 수준이 아닌가? – JRL

+0

예. 이러한 추상화 수준은 기본 메소드에 영향을주지 않고 기본 코드를 변경할 수 있음을 의미합니다. 그런 다음 정상적인 경우에 메소드에 InputStream을 전달할 필요가 없습니다. 정상적으로 작업을 수행하는 데 필요한 것이 아니기 때문입니다. – Tejs

관련 문제