2009-07-13 56 views
2

今天我遇到了非常困难的TDD问题。我需要通过HTTP POSTs与服务器交互。我找到了Apache Commons HttpClient,它可以满足我的需求。与多个合作伙伴进行单元测试

然而,我结束了从Apache的百科全书一堆协作对象的:

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相对比较舒服,但是我对其他合作者做了什么?

我可以创建一堆工厂方法(或工厂类)创建的合作者,但我有点害怕,我会嘲笑太多。

跟进

感谢您的答案!我剩下的问题是这样的方法:

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()?我需要模拟post以及client吗?

回答

4

简答题:模拟HttpClient,不要模拟PostMethod或RequestEntity。

当然,这是一个判断调用,但我建议先嘲笑真正需要嘲笑的事情:HttpClient。 PostMethod和RequestEntity是堆栈本地的,快速的和确定性的,我会让它们保持原样,如果有必要,你总是可以嘲笑它们。现在,通过嘲笑PostMethod和RequestEntity,您的代码变得复杂,使用您的api的代码变得复杂,并暴露您实现的细节。
随着代码的不断发展,您将会更好地了解需要嘲笑的内容,而无需现在就尝试预测未来。

这可能是有用的:

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

3

zielaj的回答是合理的,但你也可以创建具有以下签名PostMethodFactory:

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

...然后使用DI注入它和HttpClient。那么你只有两件事情可以嘲笑。

的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; 
} 
相关问题