我正在测试使用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());
}
}
但我现在必须发送带有multipart / form-data的POST请求。除了更改方法和内容类型之外,这并没有多大区别:
@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
我的猜测是fixd无法识别边界方。由于文档没有显示示例,我非常坚持这一部分。
我尝试使用一些通配符,如' *',没有成功。从而;我需要一种方法来告诉fixd接受该边界或使用我还没有发现的一些通配符。任何帮助都会很棒,谢谢!
答案 0 :(得分:1)
我一直在进行一些调试,似乎问题出在fixd
核心。
基本上,fixd
将每个RequestHandlerImpl
的{{1}}索引为HandlerKey
(其中包含 ContentType 作为密钥的一部分)在地图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
中可以找到任何处理程序,因为每次运行时密钥都会发生变化。
我做了一点测试只是为了检查这是问题的原因,在创建multipart请求后将contentType传递给fixd 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());
}
}
希望它可以帮助您澄清问题。干杯
答案 1 :(得分:0)
这是fixd
中的错误,已在1.0.3版中修复。您的原始代码应使用此新版fixd
。