2009-07-13 5 views
2

今日、私は非常に困難なTDD問題に遭遇しました。私はHTTP POSTを介してサーバーと対話する必要があります。私はApache Commons HttpClientを見つけました。これは私が必要とするものです。複数の共同作業者によるユニットテスト

はしかし、私は、Apache Commonsのからオブジェクトを共同での束で終わる:

public void postMessage(String url, String message) throws Exception { 

    PostMethod post = new PostMethod(url); 
    RequestEntity entity = new StringRequestEntity(message, 
             "text/xml; charset=ISO-8859-1"); 
    post.setRequestEntity(entity); 
    HttpClient httpclient = new HttpClient(); 
    try { 
     int result = httpclient.executeMethod(post); 

     System.out.println("Response status code: " + result); 
     System.out.println("Response body: "); 
     System.out.println(post.getResponseBodyAsString()); 
    } finally { 
     post.releaseConnection(); 
    } 
} 

私はPostMethodオブジェクト、RequestEntityオブジェクトとHttpClientオブジェクトを持っています。私はHttpClient alaの依存関係注入を比較的快適に過ごしていますが、他の協力者については何をしますか?

私は、共同作業者を作成するためのファクトリメソッド(またはファクトリクラス)の束を作成することができますが、私はあまりにも多くを嘲笑することに少し気になります。

フォローアップ

ありがとうございました!

public String postMessage(String url, String message) throws Exception { 

    PostMethod post = new PostMethod(url); 
    RequestEntity entity = new StringRequestEntity(message, 
             "text/xml; charset=ISO-8859-1"); 
    post.setRequestEntity(entity); 
    HttpClient httpclient = new HttpClient(); 
    httpclient.executeMethod(post); 
    return post.getResponseBodyAsString(); 
} 

どのように私が正しく返された値がpost.getResponseBodyAsString()からのものであることを確認します:私の残りの問題は、このような方法がありますか?私はpostclientと嘲笑しなければならないでしょうか?

答えて

4

短い答え:模擬HttpClientは、PostMethodまたはRequestEntityを模倣しないでください。

もちろん、これは判断の呼び出しですが、私は実際に嘲笑される必要のあるものを嘲笑することから始めましょう:HttpClient。 PostMethodとRequestEntityはスタックローカルで高速で決定的なので、そのまま残しておきます。必要に応じて後でいつでも模擬することができます。あなたのコードは今、PostMethodとRequestEntityを嘲笑することによってあなたのAPIを複雑にし、あなたのAPIを使用するコードを複雑にし、実装の詳細を公開します。
あなたのコードが進化するにつれて、今、未来を予測しようとする必要がなくなり、何が嘲笑されるべきかをよりよく理解することができます。これは便利かもしれません

http://www.testingreflections.com/node/view/7417

3

zielajの答えは音ですが、あなたはまた、次のシグネチャでPostMethodFactoryを作成することができます。

PostMethod getInstance(String url, String message, String contentType); 

を...そして注入するDIを使用しますそれとHttpClientの両方。それから、あなたはモックする2つのことしか持たないでしょう。

PostMethodFactoryは、このように実装することができます。

public PostMethod getInstance(String url, String content, String contentType, String charset) { 
    PostMethod post = new PostMethod(url); 
    RequestEntity entity = new StringRequestEntity(message, contentType, charset); 
    post.setRequestEntity(entity); 
    return post; 
} 
関連する問題