Джерси, ContainerRequestFilters и DELETE - PullRequest
1 голос
/ 01 марта 2012

Я использую Jersey 1.11 и пытаюсь смоделировать методы POST и DELETE в своем ресурсе RESTful.

Проблема, с которой я сталкиваюсь, заключается в моих модульных тестах.Я не могу использовать delete метод WebResource и все еще ожидаю экземпляр ContentResponse (есть обходные пути, но поскольку в какой-то момент я буду использовать интерфейс Rails, я бы предпочел разобраться с этим сейчас).Поэтому я пытаюсь использовать POST с PostReplaceFilter и по-разному пытался отправить форму и параметры запроса _method (установлены на DELETE), а также заголовок X-HTTP-Method-Override.

IЯ настраиваю PostReplaceFilter в web.xml следующим образом:

<servlet-name>SomeName</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
  <param-value>com.sun.jersey.api.container.filter.PostReplaceFilter</param-value>
</init-param>

Мой ресурс REST выглядит следующим образом:

@Controller
@Scope("prototype")
@Path("{apiVersion}/push/")
public class Push extends BaseRequest {
  @POST
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces(MediaType.APPLICATION_JSON)
  @Path("registration")
  public Response create(@FormParam(REGISTRATION_ID_FIELD) String registrationId) throws Exception {
    /* omitted; this method ends in a 200 OK */
  }

  @DELETE
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Path("registration")
  public Response destroy(@FormParam(REGISTRATION_ID_FIELD) String registrationId) throws Exception {
    /* omitted; this method ends in a 204 NO CONTENT */
  }

Мой модульный тест всегда вызывает первый метод создания, как если быPostReplaceFilter не имеет никакого эффекта:

 private WebResource.Builder prepare(String path, String method) {
    return resource().path(path)
            .queryParam("_method", method)
            .cookie(new Cookie(Report.DEVICE_COOKIE_NAME, TEST_DEVICE_ID))
            .cookie(new Cookie(Report.TOKEN_COOKIE_NAME, TEST_TOKEN));
 }

 @Test
 public void destroyShouldEliminateAnyPushRegistrationAndTokenForADevice() throws Exception {
    // mocks are setup here
    MultivaluedMap<String, String> formData = createFormData(registrationId);
    ClientResponse response = prepare("/1.0/push/registration", "DELETE")
        .header("X-HTTP-Method-Override", "DELETE")
        .post(ClientResponse.class, formData);
    assertThat(response.getStatus(), is(204));
    // mocks are verified here
  }

Я знаю, что первый метод вызывается, потому что create возвращает 200, в то время как метод destroy возвращает 204, а строка assertThat не работает из-засостояние 200 (кроме того, мои ожидаемые методы для моих макетов не вызываются).

Мой модульный тест наследуется от JerseyTest и использует веб-контейнер Grizzly2.

1 Ответ

2 голосов
/ 01 марта 2012

Мой коллега отметил, что web.xml на самом деле не используется как часть тестового стека. Вместо этого мне нужно было инициализировать фильтры программно; в нашем случае наш базовый тест унаследован от JerseyTest и переписал метод configure:

@Override
protected AppDescriptor configure() {
    return new WebAppDescriptor.Builder("com.yourproject.blah")
            .initParam("com.sun.jersey.spi.container.ContainerRequestFilters", 
                "com.sun.jersey.api.container.filter.PostReplaceFilter")
            .servletClass(SpringServlet.class)
            .build();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...