我正在测试使用http服务器的应用程序。我决定使用一个http服务器fixture来代替嘲笑。意思是我不必嘲笑任何产品代码。为了实现这一目标,我目前选择了免费使用第三方库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请求。除了改变方法和内容类型之外,没有什么区别:
@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接受这个边界,要么使用一些我还没有发现的通配符。任何帮助都很好,谢谢!

最佳答案

我一直在做一些调试,似乎问题出在fixd内核中。
基本上,fixd在mapRequestHandlerImpl中通过一个HandlerKey索引每个handlerMap(包括作为键的一部分的contenttype)。参见方法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传递给fixdserver.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());
      }
   }

希望它能帮助你澄清这个问题。干杯

10-04 13:43