我正在實現一個使用web服務的客戶端。我想減少依賴關係,並決定模擬web服務。
我使用mockito,與EasyMock相比,它能夠模擬類而不僅僅是接口。但那不是重點。模擬web服務的策略
在我的測試中,我得到這個代碼:
// 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的一個例子是London on GeoNames。 在我看來,它太細緻。
但是,我怎樣才能嘲笑一個web服務而不給永久?我應該讓模擬對象返回一個XML文件嗎?
這不是代碼,而是方法。
我使用JUnit 4.x和1.7的Mockito
謝謝,我明白了你的觀點。那麼你會如何「嘲笑web服務」? – guerda 2009-04-30 06:08:18