Я не уверен, что вы пытаетесь сделать и почему вы хотели бы издеваться над Response
.Когда вы запускаете тест для ваших ресурсов, обычно вам нужно выполнить интеграционные тесты.Это влечет за собой фактический запрос к конечной точке с использованием клиентской библиотеки.MockMvc
работает только при использовании Spring MVC в качестве среды REST.Но в вашем случае вы используете Джерси (я полагаю, основываясь на теге jax-rs в вашем сообщении.
Что касается клиентской библиотеки, вы можете использовать Клиентское API Jersey / JAX-RS или вы можете использовать Spring Boot TestRestTemplate
, как они это делают в официальном примере Spring Boot / Jersey . Для проверки созданного URI для ресурса POST / Createdто, что вы должны сделать, это проверить заголовок Location
в ответе. Это значение устанавливается на стороне сервера, когда вы делаете Response.created(URI)
. Например, допустим, что это ваш ресурс
@Path("customers")
public class CustomersResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response createCustomer(Customer customer, @Context UriInfo uriInfo) {
int customerId = // create customer and get the resource id
UriBuilder builder = uriInfo.getAbsolutePathBuilder();
builder.path(Integer.toString(customerId));
return Response.created(builder.build()).build();
}
}
Jersey автоматически установит для Location
значение URI, переданного в created()
Затем (если вы используете клиент Jersey), тогда ваш тест может выглядеть примерно так:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ExampleResourceTest {
@LocalServerPort
private int port;
private Client client = ClientBuilder.newClient();
@Test
public void testCustomerLocationOnPost() {
Customer customer = new Customer("Jane", "Doe");
URI resourceUri = UriBuilder.fromUri("http://localhost")
.port(port).path("api").path("customers").build();
Response response = client.target(resourceUri).request().post(Entity.json(customer));
// test that we get the correct status code
assertThat(response.getStatus())
.isEqualTo(Response.Status.CREATED.getStatusCode());
// test that the location header is correct.
assertThat(response.getHeaderString(HttpHeaders.LOCATION))
.isEqualTo(UriBuilder.fromUri(resourceUri).path("123").build().toString());
}
}
Что касается зависимостей, для использования Jersey с Spring Boot необходимо использовать зависимость spring-boot-started-jersey
. Также избавьтесь от имеющейся зависимости jersey-core
. Полный пример см. В связанном проекте выше.