문제

웹 서비스를 소비하는 클라이언트를 구현하고 있습니다. 의존성을 줄이고 웹 서비스를 조롱하기로 결정했습니다.
나는 사용한다 모키토, 인터페이스뿐만 아니라 클래스를 조롱 할 수있는 이점과 EasyMock과 비교할 수 있습니다. 그러나 그것은 요점이 아닙니다.

테스트 에서이 코드가 있습니다.

// Mock the required objects
Document mDocument = mock(Document.class);
Element mRootElement = mock(Element.class);
Element mGeonameElement = mock(Element.class);
Element mLatElement = mock(Element.class);
Element mLonElement = mock(Element.class);

// record their behavior
when(mDocument.getRootElement()).thenReturn(mRootElement);
when(mRootElement.getChild("geoname")).thenReturn(mGeonameElement);
when(mGeonameElement.getChild("lat")).thenReturn(mLatElement);
when(mGeonameElement.getChild("lon")).thenReturn(mLonElement);
// A_LOCATION_BEAN is a simple pojo for lat & lon, don't care about it!
when(mLatElement.getText()).thenReturn(
    Float.toString(A_LOCATION_BEAN.getLat()));
when(mLonElement.getText()).thenReturn(
    Float.toString(A_LOCATION_BEAN.getLon()));

// let it work!
GeoLocationFetcher geoLocationFetcher = GeoLocationFetcher
    .getInstance();
LocationBean locationBean = geoLocationFetcher
    .extractGeoLocationFromXml(mDocument);

// verify their behavior
verify(mDocument).getRootElement();
verify(mRootElement).getChild("geoname");
verify(mGeonameElement).getChild("lat");
verify(mGeonameElement).getChild("lon");
verify(mLatElement).getText();
verify(mLonElement).getText();

assertEquals(A_LOCATION_BEAN, locationBean);

내 코드가 보여주는 것은 소비하는 객체를 "마이크로 테스트"한다는 것입니다. 테스트에서 생산 코드를 구현하는 것과 같습니다. 결과 XML의 예는 다음과 같습니다 Geonames의 런던. 제 생각에는 너무 세분화됩니다.

그러나 모든 것을주지 않고 웹 서비스를 어떻게 조롱 할 수 있습니까? 모의 개체가 XML 파일을 반환하도록해야합니까?

코드에 관한 것이 아니라 접근하다.

Junit 4.X와 Mockito 1.7을 사용하고 있습니다

도움이 되었습니까?

해결책

웹 서비스에서 결과를 사용하는 코드로 반환 된 결과를 조롱하고 싶습니다. 위의 예제 코드에서는 MDocument를 조롱하는 것처럼 보이지만 웹 서비스의 조롱 된 인스턴스에서 반환 된 MDocument 인스턴스를 전달하고 geolocationfchetcher에서 LocationBean이 a_location_bean의 값과 일치한다고 주장합니다.

다른 팁

여기서 실제 문제는 웹 서비스를 호출하고 만들어주는 싱글 톤이있어서 모의를 삽입하기가 어렵다는 것입니다.

싱글 톤 클래스에 (패키지 레벨) 액세스를 추가해야 할 수도 있습니다. 예를 들어 생성자가 모양을 보이는 경우

private GeoLocationFactory(WebService service) {
   ...
}

생성자 패키지 레벨을 만들고 조롱 된 웹 서비스로 하나를 만들 수 있습니다.

또는 돌연변이 가능한 싱글 톤을 좋아하지는 않지만 세터 메소드를 추가하여 웹 서비스를 설정할 수 있습니다. 또한이 경우 Webservice를 나중에 설정하지 않아야합니다.

웹 서비스가 메소드에서 생성되면 Mock 서비스를 대체하기 위해 GeolocationFactory를 확장 할 수 있도록해야 할 수도 있습니다.

싱글 톤 자체를 제거 할 수도 있습니다. 온라인으로 기사가 있으며 아마도 그 방법에 대한 기사가있을 것입니다.

가장 쉬운 옵션은 웹 서비스 클라이언트를 조롱하는 것입니다.

when(geoLocationFetcher.extractGeoLocationFromXml(anyString()))
    .thenReturn("<location/>");

파일 시스템에서 응답 XML을 읽도록 코드를 수정할 수 있습니다.

샘플 코드는 여기에서 찾을 수 있습니다. mockito와 함께 .net 웹 서비스를 조롱합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top