我正在实现一个使用 Web 服务的客户端。我想减少依赖并决定模拟网络服务。
我使用mockito,它与 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 的一个示例是London on GeoNames。在我看来,它太细了。
但是我怎样才能在不给出每一步的情况下模拟一个 web 服务呢?我应该让模拟对象只返回一个 XML 文件吗?
这不是关于代码,而是关于方法。
我正在使用 JUnit 4.x 和 Mockito 1.7