Я в середине тестирования моего приложения, которое использует 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 принять эту границу, либо использовать некоторые подстановочные знаки, которые я еще не обнаружил. Любая помощь будет большой, спасибо!
Я делаю отладку, и, похоже, проблема в ядре 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());
}
}
Надеюсь, это поможет вам прояснить проблему. ура
Это была ошибка в fixd
и исправлена в версии 1.0.3. Ваш исходный код должен работать с использованием этой новой версии fixd
.