Результаты формата JSON из HTTPBuilder GET изменены между 0.5.2 и 0.6

Недавно мы обновили зависимости теста интеграции REST, в котором используются Groovy, HTTPBuilder, JSONAssert и Junit. Когда мы перешли с HTTPBuilder 0.5.2 на 0.6, многие наши тесты провалились.

Мы обнаружили, что формат ответа изменился из-за новой «функции» в HTTPBuilder, которая обеспечивает «автоматический анализ ответов для зарегистрированных типов контента».

Старый, (0.5.2) формат, ожидаемый ответ:

[ { "name":"Portfolio_REST_Test01", "description":"", "referenceValueType":"Net Value", "unitType":"SHARES", "tags":[] } ]

Новый (0.6.2) формат ответа:

[{tags=[], referenceValueType=Net Value, unitType=SHARES, description=, name=Portfolio_REST_Test01}]

Проблема возникает, когда JSONAssert пытается проанализировать именованное значение, где значение представляет собой пустую строку, см. «Описание» в приведенных выше примерах. JSONAssert ожидает, что символ будет следовать знаку равенства, а не запятой, и при обнаружении выдает исключение.


person Robert    schedule 11.09.2013    source источник
comment
Я предполагаю, что вопрос в том, как мне вернуться к старому формату? (вы не указываете вопрос)... Можете ли вы опубликовать код для одного из ваших неудачных тестов? Как вы получаете данные из HTTPBuilder?   -  person tim_yates    schedule 11.09.2013
comment
Да, вы правы, спасибо. Формат изменился, нарушив наши тесты. Нам нужно было вернуть старый формат.   -  person Robert    schedule 11.09.2013


Ответы (1)


Углубившись в это, мы обнаружили изменения, которые необходимо внести в HTTPBuilder, чтобы продолжать получать неформатированные ответы, которые предоставляет версия 0.5.2.

Фрагмент старого кода Groovy:

  // perform a GET request, expecting JSON response data
  http.request(Method.GET, ContentType.JSON) { req ->

     uri.path = restPath;
     requestContentType = JSON;
     uri.query = mapQuery;
     headers.Accept = 'application/json';

     // response handler for a successful response code:
     response.success = { resp, json ->
   // Check returned status'
   assertResp(resp, expStatus);
   return json.toString();
     }
     // Check returned status' for the 400's and 500's
     response.failure = { resp ->
        // Check returned status'
        assertResp(resp, expStatus);
     }

В документации HTTPBuilder указано, что автоматическое форматирование будет использоваться для известных типов, таких как JSON и XML. Чтобы отключить эту функцию, необходимо указать ContentType TEXT в http.request. Но когда это сделано, значение toString объекта "json" (в замыкании response.success) больше не возвращает возвращаемые значения JSON. Эти значения находятся в свойстве text.

Итак, окончательный код выглядит так:

  // perform a GET request, expecting JSON response data
  http.request(Method.GET, ContentType.TEXT) { req ->

     uri.path = restPath;
     requestContentType = JSON;
     uri.query = mapQuery;
     headers.Accept = 'application/json';

     // response handler for a successful response code:
     response.success = { resp, json ->
   // Check returned status'
   assertResp(resp, expStatus);
   return json.text;
     }
     // Check returned status' for the 400's and 500's
     response.failure = { resp ->
        // Check returned status'
        assertResp(resp, expStatus);
     }

Надеюсь, что если кто-то столкнется с такой же проблемой, он обратится к Stack Overflow и найдет эти заметки полезными. С уважением

person Robert    schedule 11.09.2013