找不到具有边界的POST的处理程序

时间:2014-09-02 13:05:58

标签: java unit-testing http junit

我正在测试使用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接受该边界或使用我还没有发现的一些通配符。任何帮助都会很棒,谢谢!

2 个答案:

答案 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