Я использую 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.