1

Web サービスを使用するクライアントを実装しています。依存関係を減らしたいので、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 の例はGeoNames の London です。私の意見では、それはあまりにも細分化されています。

しかし、すべてのステップを与えずに Web サービスをモックするにはどうすればよいでしょうか? モック オブジェクトが XML ファイルを返すようにする必要がありますか?

それはコードではなく、アプローチです。

JUnit 4.x と Mockito 1.7 を使用しています

4

3 に答える 3

2

ここでの本当の問題は、Webサービスを呼び出して作成するシングルトンがあるため、模擬サービスを挿入するのが難しいことだと思います。

シングルトンクラスへの(場合によってはパッケージレベルの)アクセスを追加する必要がある場合があります。たとえば、コンストラクタが次のようになっている場合

private GeoLocationFactory(WebService service) {
   ...
}

コンストラクターパッケージレベルを作成し、モックされたWebサービスを使用して作成することができます。

または、ミューテイタブルシングルトンは好きではありませんが、setterメソッドを追加してWebサービスを設定することもできます。また、その場合は、後でWebサービスの設定を解除することを忘れないでください。

Webサービスがメソッドで作成されている場合は、GeoLocationFactoryを拡張可能にしてモックサービスに置き換える必要がある場合があります。

シングルトン自体を削除することも検討できます。オンラインの記事があり、おそらくそれを行う方法についてはここにあります。

于 2009-06-02T16:48:45.997 に答える
1

Web サービスから返された結果を、その結果を使用するコードにモックする必要があります。上記のコード例では、mDocument をモックしているように見えますが、実際には、Web サービスのモックされたインスタンスから返された mDocument のインスタンスを渡し、geoLocationFetcher から返された locationBean が A_LOCATION_BEAN の値と一致することをアサートする必要があります。

于 2009-04-30T05:53:44.233 に答える
1

最も簡単なオプションは、WebService クライアントをモックすることです。

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

コードを変更して、ファイル システムから応答 xml を読み取ることができます。

サンプル コードは次の場所にあります: Mocking .NET WebServices with Mockito

于 2012-01-27T15:13:27.667 に答える