2011-10-21 3 views
3

java.net.URL을 통해 웹 서비스를 호출하는 서블릿 클래스에 대한 단위 테스트를 작성하고 싶습니다.URL 호출을하는 서블릿 단위 테스트

mockHttpServletRequest, MockHttpServletResponse를 생성하고 doGet에 전달하여 모의 요청 및 응답 객체를 작성하여 서블릿의 doGet 메소드로 쉽게 보낼 수 있습니다 (junit의 실용적인 프로그래머 텍스트의 기술 사용).

문제가있는 부분은 서블릿에서 열린 URL입니다.

지금 당장은 URL을 열고 문자열 (프로덕션 코드)을 반환하는 함수를 호출하고이를 반환하는 함수를 호출하면 고정 된 URL에 대한 문자열이 직접 반환됩니다. 테스트 코드)

이상적으로는 테스트 코드가 보이지 않는 doGet 메소드가 필요합니다. 네트워크 액세스를 만드는 함수와 직접 문자열을 반환하는 함수 중 하나는 doGet에 투명해야합니다.

나는 이것을 달성하는 여러 가지 방법을 생각할 수 있지만, 아무렇지도 않게 느낀다.

  • 예 1 : testOn 부울을 가지고있는 클래스의 기능 및 setTestMode 방법 랩; junit init은 testMode를 true로 설정할 수 있으며, 기본값은 false입니다. testOn은 호출 할 메소드를 결정합니다. 부정적인 것은 새로운 수업이 필요하다는 것입니다.

  • 예 2 개의 클래스가 네트워크 접속 중 하나가 거짓 인 구현을 가지고; junit을 mock 클래스를 다시로드하고, 프로덕션 코드가 일반 클래스를로드하도록합니다 (또는 어떻게 든 mock 클래스에 프로덕션 클래스를 다시 매핑). 부정적 : 이것이 어떻게 행해질 지 확신하지 못한다. 서투른 것처럼 보인다.

  • 예 3 : 내가 모의 객체를 사용하여 필드 값을 기준으로 서블릿의 URL 액세스를 조정하려는 경우 정적 필드가있는 클래스를 나타내는 있습니다. 부정 : 글로벌 변수와 같은 느낌.

  • 예 4 : 만 URL로 전환 (그러나 java.net.URL의가 최종) 경우 생산 코드가 잘 작동 할 수 있도록, URL을 확장합니다.

나는 아침의 검색을 통해 옳은 대답을 찾을 수 없었으므로, 그래서 나는 집단적 지혜로 돌아 섰다.

감사합니다, 아드 난

추신 - 내가, 내가의 java.net.URL을 사용하지 않아도 작동 상당의 무엇이든을 언급해야한다.

답변

3

두 번째 옵션은 "올바른"옵션입니다. 외부 URL에 대한 호출은 서비스에 캡슐화되어야합니다. 서비스는이를 사용하는 서블릿으로 주입됩니다. 이것은 Inversion of Control이 도움이되는 곳입니다. 당신의 단위 테스트에서

당신은, 테스트 구현을 주입하는 것입니다 현실에서 당신은 실제 구현을 주입하는 것입니다. 서비스에 대한 세터를 제공하고 "실제"구현을 기본값으로 설정하는 것만 큼 간단 할 수 있습니다.

이런 종류의 것은 IoC/DI의 표준적인 예입니다.

+0

감사합니다 tomasz 및 dave - 내 검색 과정에서 IoC에 대한 참조를 보았지만 연결할 수 없었습니다. 다시 돌아가서 다시 확인해 보겠습니다. 알고있는 고품질 자습서로의 링크를 환영합니다. – adnan

+0

@ user453026 아마도 "제어 반전"또는 "종속성 삽입"플러스 "튜토리얼"을 검색하려고 할 것입니다 ... 대부분은 검색 할 때 프레임 워크에 따라 다릅니다. 대부분의 경우 기본 프레임 워크를 이해하지 못하더라도 기본을 시각화하는 데 도움이됩니다. –

2

휠을 다시 발명 한 것처럼 보였습니다. 다시 작성한 사람은 예 2입니다. 이것은 일반적으로 종속성 주입을 사용하여 구현되며 실제로는 지금까지 개발자가 생각해 낸 최고의 솔루션 소프트웨어입니다.

인터페이스 뒤에서 웹 서비스 호출을 숨 깁니다. 한 구현은 실제 호출을 수행하고 다른 구현은 사용자가 구성 할 수있는 모의 객체입니다. DI 프레임 워크 (Spring, Guice, EJB/CDI)를 사용하지 않는 경우 테스트에서 수동으로 구현 구현을 mock으로 대체하십시오.