Можно ли использовать Spring EL в качестве эффективного языка запросов?
Кто-нибудь знает, можно ли использовать spel в качестве языка запросов так же, как с xpath?
Мой случай использования, что я использую Spring RestTemplate
сделать http-запрос на интеграционное тестирование приложения, которое мы пишем. Данные ответа - это json, и вместо того, чтобы создавать небольшую группу классов доменов, с которыми связан ответ, я связываю ответ со стандартом java.util.Map
(Упрощенный) типичный ответ может выглядеть так:
{
'links': [
{
'rel':'self',
'href':'http://somesite.com:49156/places',
'lastModified':'2014-11-27T21:42:49Z'
},
{
'rel':'place',
'href':'http://somesite.com:49156/places/2345',
'lastModified':'2014-11-27T21:42:49Z'
}
]
}
Учитывая, что эти данные привязаны к карте, мы можем написать утверждения, основанные на вызове метода get карты и т. Д.
Например, если бы я хотел утверждать, что ссылка "я" была " http://somesite.com:49156/places", мне пришлось бы:
- Вызовите.get("links") на карте тела ответа и приведите его к
List<Map>
- Выполните цикл по результирующему списку, и для каждой записи (которая является картой) вызовите.get("rel") и проверьте, является ли его значение "self"
- Как только у меня будет правильная карта (т. Е. Ссылка 'self'), я вызову.get("href") и установлю ее значение в соответствии с ожидаемым значением.
Уф! Грязный, хрупкий, противный код! Это плохо на многих уровнях!
Итак, я сейчас смотрю, может ли spel помочь мне.
Мне все еще нравится идея связать ответ JSON с хорошим универсальным Map
так как у нас есть много разных конечных точек, мы будем тестировать, где граф объекта ответа может быть довольно сложным - в общем, мы в конечном итоге получим много и много pojo.
Хотя для тестов было бы очень удобно просто вызывать геттеры и другие подобные вспомогательные методы, просто не нужно создавать множество классов.
Так что привязка к Map
это просто, потому что это не связано с работой:) Но как это проверить...
Если бы это был XML (а это не так), мы могли бы написать запрос xpath в следующем виде:
//links/link[rel='self']/href
Поэтому я хотел бы попытаться сделать что-то похожее с spel, если смогу.
- Выражение
[links]
вернет мнеList
изMap
s - выражение
[links][0]
получит первую запись вList
- и выражение
[links][0][href]
получит запись с первой карты, ключ которой - 'href'
Но я должен быть в состоянии эффективно заменить [0]
часть выражения с чем-то вроде "возьми мне того, чья запись" rel "имеет значение" self "- я в основном хочу использовать spel в качестве языка запросов.
Кто-нибудь знает возможно ли это?
Спасибо Натан
PS. Поскольку это проект Spring, я уже знаю о MockMvc и JsonPath. MockMvc не прав в этом случае, так как эти тесты полны до конца, поэтому нет необходимости что-либо издеваться. Re: JsonPath, техническому руководителю этого проекта очень не нравится его, поэтому меня попросили исследовать альтернативы:(