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 зависимость, но что мне делать с другими сотрудниками?

Я мог бы создать кучу фабричных методов (или заводского класса), чтобы создать соавторов, но я немного боюсь, что я буду слишком насмехаться.

Follow Up

Спасибо за ответы! Мой оставшийся вопрос является метод так:

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

Короткий ответ: mock 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. Тогда у вас будет только две вещи, чтобы насмехаться.

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^