2015-07-17 4 views
0

Я пытаюсь выполнить stubbing с помощью Wiremock, чтобы предоставить ответ на основе тела, которое отправляется в почтовом запросе.Возврат json в Wiremock с использованием JSONPath на основе значения атрибута

Например, при отправке этого JSON:

{ 
    "person": { 
     "firstName": "paul", 
     "age": "50" 
    } 
} 

Я хочу отправить pauldata.json

Это мой запрос/ответ JSON ниже:

{ 
    "request": { 
    "method": "POST", 
    "url": "/api/test1", 
    "bodyPatterns": [ 
     { 
     "matchesJsonPath": "$.person[?(@.firstName=='paul')]" 
     } 
    ] 
    }, 
    "response": { 
    "status": 200, 
    "bodyFileName": "pauldata.json", 
    "headers": { 
     "Content-Type": "application/json" 
    } 
    } 
} 

Однако это приводит к ошибка:

JSON path expression '$.person[?(@.firstName=='paul')]' failed to match document because of error 'net.minidev.json.JSONObject cannot be cast to java.util.List

это выражение: $ .person [? (@. FirstName == 'paul')] соответствует json с реализацией Jayway в http://jsonpath.herokuapp.com/, но не в реализации Goessner, которую использует Wiremock.

Я заметил, что если я просто делаю $ .person.firstName в jayway, он возвращает «paul», , но когда я делаю то же самое в Гесснере, я получаю [«paul»].

Как я могу совместить значение ключа с использованием реализации Jesserath Goessner, поэтому я могу вернуть пользовательский json на основе значения ключа в моих данных?

ответ

2

WireMock не принимает все выражения JSONPath, хотя они действительно работают в онлайн-тестерах. У меня была такая же проблема, и решить ее с помощью следующего:

{ 
    "request": { 
    "method": "POST", 
    "url": "/api/test1", 
    "bodyPatterns": [ 
     { 
     "matchesJsonPath": "$..[?(@.firstName=='paul')]" 
     } 
    ] 
    }, 
    "response": { 
    "status": 200, 
    "bodyFileName": "pauldata.json", 
    "headers": { 
     "Content-Type": "application/json" 
    } 
    } 
} 

Единственное, что изменилось от:

$.person[?(@.firstName=='paul')] 

To:

$..[?(@.firstName=='paul')] 

Это потому, что .. обозначение поиск через все входные данные рекурсивно.

Если вам нужно запросить корневой элемент, то есть тот, у которого нет родительского элемента, тот же JSONPath будет делать. Например, представьте, у вас есть еще один элемент, например, так:

{ 
    "person": { 
     "firstName": "paul", 
     "age": "50" 
    }, 
    "test": "true" 
} 

В случае, если вы хотите, чтобы соответствовать для «теста»: «правда» вам нужно будет JSONPath следующим образом:

$..[?(@.test=='true')] 

Я проверил все в мой WireMock, чтобы он работал.

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

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