Не удается найти обработчик для POST с границей

1

Я в середине тестирования моего приложения, которое использует HTTP-сервер. Вместо того, чтобы насмехаться, я решил пойти с сервером HTTP-сервера. Это означает, что мне не нужно издеваться над производственным кодом. Для достижения этой цели я в настоящее время выбрал бесплатную бесплатную стороннюю библиотеку fixd.

Я смог успешно создать несколько модульных тестов, которые работают с помощью запроса GET. Большинство из них довольно просты:

@Test
public void verifyConnectionTest()
{
    try
    {
        final String body = FileUtils.readFileToString(RESOURCE);
        final String path = "/";

        this.server.handle(Method.GET, path).with(
                new HttpRequestHandler() {

                    @Override
                    public void handle(final HttpRequest request,
                            final HttpResponse response)
                    {
                        response.setStatusCode(200);
                        response.setContentType("text/xml");
                        response.setBody(body);
                    }
                });

        // Setting up my HTTP client
        // Execute some tasks
        // asserting of everything was valid
    }
    catch (final IOException e)
    {
        fail(e.getMessage());
    }
}

Но теперь мне нужно отправить запрос POST с помощью multipart/form-data. Это не имеет большого значения, кроме изменения метода и типа содержимого:

@Test
public void executeStepTest()
{
    try
    {
        final String body = FileUtils.readFileToString(SERVICE_RESPONSE);
        final String path = "/";

        this.server.handle(Method.POST, path, "multipart/form-data").with(
                new HttpRequestHandler() {

                    @Override
                    public void handle(final HttpRequest request,
                            final HttpResponse response)
                    {
                        response.setStatusCode(200);
                        response.setContentType("text/xml");
                        response.setBody(body);
                    }
                });

                // Setting up my HTTP client
                // Execute some tasks
                // asserting of everything was valid
    }
    catch (final IOException e)
    {
        fail(e.getMessage());
    }
}

Однако я получаю следующую ошибку: [ERROR] could not find a handler for POST - / - multipart/form-data; boundary=bqCBI7t-VW1xaJW7BADmTiGMg9w_YM2sHH8ukJYx [ERROR] could not find a handler for POST - / - multipart/form-data; boundary=bqCBI7t-VW1xaJW7BADmTiGMg9w_YM2sHH8ukJYx и я предполагаю, что fixd не распознает граничную сторону. Поскольку в документации нет примера, я совсем застрял в этой части.

Я пробовал использовать некоторые подстановочные знаки, такие как "*", никаких успешных действий. Таким образом, Мне нужен способ либо сказать fixd принять эту границу, либо использовать некоторые подстановочные знаки, которые я еще не обнаружил. Любая помощь будет большой, спасибо!

Теги:
unit-testing
junit
http

2 ответа

1
Лучший ответ

Я делаю отладку, и, похоже, проблема в ядре fixd.

В основном, fixd индексирует каждый RequestHandlerImpl с помощью HandlerKey (который включает ContentType как часть ключа) в map handlerMap. См. Метод org.bigtesting.fixd.core.FixtureContainer#resolve.

...
HandlerKey key = new HandlerKey(method, route, contentType);
RequestHandlerImpl handler = handlerMap.get(key);
if (handler == null) {
  // Error
}
...

Проблема. Когда запрос представляет собой multipart/form-data, boundary данные (которые он генерирует динамически каждый запрос) являются частью типа контента. Таким образом, любой обработчик найден в handlerMap потому что ключ изменяется при каждом запуске.

Я сделал небольшой тест только для проверки того, что это является причиной проблемы, передав contentType для исправления server.handle после создания server.handle запроса, и он отлично работает.

См. Тест ниже:

   @Test
   public void verifyConnectionTest_multipart() {
      try {
         // 1. Create multipart request (example with http-commons 3.1)
         PostMethod filePost = new PostMethod(url);
         Part[] parts = { new StringPart("param", "value") };
         MultipartRequestEntity request = new MultipartRequestEntity(parts, filePost.getParams());
         filePost.setRequestEntity(request);

         // 2. fixd server handle (passing the request content type)
         this.server.handle(Method.POST, "/", request.getContentType()).with(
               new HttpRequestHandler() {

                  @Override
                  public void handle(final HttpRequest request,
                                     final HttpResponse response) {
                     response.setStatusCode(200);
                     response.setContentType("text/xml");
                  }
               });

         // 3. Execute multipart request
         HttpClient client = new HttpClient();
         int status = client.executeMethod(filePost);

         // 4. Assertions
         Assert.assertEquals(200, status);

      } catch (Exception e) {
         Assert.fail(e.getMessage());
      }
   }

Надеюсь, это поможет вам прояснить проблему. ура

  • 0
    Идеальный улов! Я искал правильное направление, но не смог его решить. Теперь система выдвигает HttpPost-объект (org.apache.http.client.methods.HttpPost). С этого момента я могу получить тип содержимого - и если я хочу (правильный) путь. Передайте это, чтобы исправить и сделать - у меня есть ручка. Еще раз спасибо!
  • 0
    Пожалуйста. Рад помочь вам и спасибо за награду;)
0

Это была ошибка в fixd и исправлена в версии 1.0.3. Ваш исходный код должен работать с использованием этой новой версии fixd.

  • 0
    Вероятно, это должен быть комментарий.
  • 0
    Сначала я пытался оставить комментарий, но мне не разрешили. Я увидел сообщение о том, что у меня должна быть 50 репутация, чтобы комментировать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню