MockServer и OkHttp: несоответствие типов телосложения (json против строки) - PullRequest
0 голосов
/ 01 марта 2019

Сообщество Hi Stack Overflow!

Я пытаюсь смоделировать микросервис в некоторых тестах интеграции Java.

Для этого я использую MockServer версии 5.5.1.Для выполнения остальных запросов я использую OkHttp версии 3.13.1

Код в java:

final SomeDTO requestObject = new SomeDTO(someParams);
final String jsonObject = objectMapper.writeValueAsString(requestObject);
final MediaType MEDIA_TYPE_JSON = MediaType.get("application/json; charset=utf-8");

final RequestBody requestBody = RequestBody.create(MEDIA_TYPE_JSON, jsonObject);
final Request request = new Request.Builder().url("serverUrl").post(requestBody).build();

final Response response = client.newCall(request).execute();
final String responseJson = response.body().string();
final ResultDTO result = objectMapper.readValue(responseJson, ResultDTO.class);

Это прекрасно работает.Однако, когда я присоединяю MockServer к устройству сопоставления:

 final MockServerClient client = new MockServerClient("127.0.0.1", 1080);
 client.when(request().withMethod("POST") //
                      .withPath("serverUrl") //
                      .withBody(json(correctJsonString, MatchType.ONLY_MATCHING_FIELDS))) //
       .respond(response().withStatusCode(200) //
                          .withHeaders(new Header("Content-Type", "application/json; charset=utf-8"),
                                        new Header("Cache-Control", "public, max-age=86400"))
                          .withBody(responseJson));

, я получаю request didn't match expectation because: body didn't match, где разница между телами равна:

Запрос:

"body" : {
  "type" : "STRING",
  "string" : "{\"id\":33611,\"prop1\":28,\"prop2\":\"value2\",\"graph\":[...]}",
  "contentType" : "text/plain; charset=utf-8"
}

Запрос должен соответствовать:

"body" : {
  "type" : "JSON",
  "json" : "{\"prop2\":\"value2\",\"prop1\":28,\"graph\":[...]}"
}

Итак, мои вопросы:

  • Правильно ли предположить, что из-за типа "JSON" <-> "STRING" тело нене совпадают?
  • Это неверная интерпретация MockServer или OkHttp генерирует неправильный запрос?(Сам запрос работает)
  • Есть предложения как это исправить?

1 Ответ

0 голосов
/ 19 апреля 2019

Вот демоверсия JSON:

    @Test
public void testRemote3() {
    String host = "localhost";
    int port = 1080;
    String url = String.format("http://%s:%d",host,port);
    MockServerClient mockServerClient = new MockServerClient(host,port);
    mockServerClient.when(
            request()
                    .withMethod("POST")
                    .withPath("/order/completed/notify")
                    .withBody(new JsonBody("{\"username\":\"foo1\", \"age\": 13}", Charset.forName("UTF-8"),MatchType.STRICT))
    ).respond(
            response().withStatusCode(200)
                    .withCookie("sessionId", "2By8LOhBmaW5nZXJwcmludCIlMDAzMW")
                    .withHeader("Location", "https://www.mock-server.com")
                    .withBody("{\"username\":\"wang\", \"status\": 1}")
    );
    mockServerClient.when(
            request()
                    .withMethod("POST")
                    .withPath("/order/completed/notify")
                    .withBody(new JsonBody("{\"username\":\"zhao\", \"age\": 3}", Charset.forName("UTF-8"),MatchType.STRICT))
    ).respond(
            response().withStatusCode(200)
                    .withCookie("sessionId", "2By8LOhBmaW5nZXJwcmludCIlMDAzMW")
                    .withHeader("Location", "https://www.mock-server.com")
                    .withBody("{\"username\":\"wang\", \"status\": true}")
    );
    log.info("----------------->calling ");
    Map<String,Object> userInfo = new HashMap<>();
    userInfo.put("age",13);
    userInfo.put("username","foo1");
    String result = OkHttpUtils.postJson(url+"/order/completed/notify",userInfo);
    log.info(result);
    Map<String,Object> fool = new HashMap<>();
    fool.put("age",3);
    fool.put("username","zhao");
    result = OkHttpUtils.postJson(url+"/order/completed/notify",fool);
    log.info(result);
}
...