Модульное тестирование с несколькими сотрудниками - PullRequest
2 голосов
/ 14 июля 2009

Сегодня я столкнулся с очень сложной проблемой 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, но что мне делать с другими соавторами?

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

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?

Ответы [ 2 ]

4 голосов
/ 14 июля 2009

Краткий ответ: издевайтесь над HttpClient, не издевайтесь над PostMethod или RequestEntity.

Конечно, это призыв к суждению, но я бы посоветовал начать с насмешек, которые действительно нужно высмеивать: HttpClient. PostMethod и RequestEntity являются локальными, быстрыми и детерминированными в стеке, я бы оставил их как есть, вы всегда можете при необходимости над ними посмеяться. Как и ваш код, издеваясь над PostMethod и RequestEntity, вы усложняете ваш API, усложняете код, использующий ваш API, и раскрываете детали своей реализации.
По мере развития вашего кода у вас будет более четкое представление о том, что нужно смоделировать, не нужно пытаться предсказывать будущее сейчас.

Это может быть полезно:

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

3 голосов
/ 14 июля 2009

Ответ Зиелажа является звуковым, но вы также можете создать 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;
}
...