Как сохранить значение из XML -MvcResult в переменную с помощью xpath - PullRequest
1 голос
/ 15 апреля 2020

У меня есть интеграционный тест, чтобы протестировать две остальные службы с приложением типа контента / xml. Первая конечная точка вызывается почтовым запросом, чтобы создать человека и вернуть идентификатор редакции. Этот идентификатор генерируется с помощью последовательности sql в базе данных H2 SQL, поэтому этот идентификатор может отличаться. Теперь я хочу удалить запись и вызвать вторую конечную точку. Тест должен проверить вторую конечную точку. Проблема в том, что мне нужно значение идентификатора ревизии из первого вызова.

Вот мой тест:

String revisionID;
mvc.perform(post("url/create")
   .contentType(MediaType.APPLICATION_XML)
   .content(readXML("person")).accept("application/xml"))
   .andExpect(status().isCreated())
   //  here I can do some tests, but I need to store the id value
   //  I have no idea to store the node in revisionId
   .andExpect(xpath("/context/revisionId/text()").exist());

mvc.perform(delete("url/remove/revision/" + revisionId) // I need to know the id here
   .contentType(MediaType.APPLICATION_XML)
   .andExpect(status().isOk());

Тестирование значений или количества узлов таким способом работает отлично, но Я не мог найти простое решение для извлечения / хранения значения с помощью xpath. Мой план B состоит в том, чтобы использовать java. xml .Xpath или JAXB, но я не могу поверить, что нет никакого весеннего пути с каркасом Mock Mvc.

Я не могу использовать json, потому что это старая система, которая использует эти точки отдыха.

Заранее спасибо

1 Ответ

0 голосов
/ 17 апреля 2020

Я использовал свой план B и написал метод xpath

public  String getXpathValue( MvcResult xmlResult, String xpath) throws UnsupportedEncodingException, XPathExpressionException {
    String content = xmlResult.getResponse().getContentAsString();
    XPath xPathInstace = XPathFactory.newInstance().newXPath();
    InputSource inputXML = new InputSource(new StringReader(content));
    String result = xPathInstace.evaluate(xpath, inputXML);
    return result;
}

, и я использую его следующим образом:

AtomicReference<Long> longAtomicReference = new AtomicReference<>();
mvc.perform(post("url/create")
   .contentType(MediaType.APPLICATION_XML)
   .content(readXML("person")).accept("application/xml"))
   .andExpect(status().isCreated()) 
   .andExpect(xpath("/context/revisionId/text()").exist())
   .andDo(xmlResult -> {
        longAtomicReference.set(Long.parseLong(getXpathValue(xmlResult, "//revisionId")));
   });
Long revisionId = longAtomicReference.get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...