Access to request and response byte[] in WebTestClient

The WiretapConnector now decorated the ClientHttpRequest & Response
in order to intercept and save the actual content written and read.

The saved content is now incorporated in the diagnostic output but may
be used for other purposes as well (e.g. REST Docs).

Diagnostic information about an exchange has also been refactored
similar to command line output from curl.
This commit is contained in:
Rossen Stoyanchev
2017-02-20 18:26:31 -05:00
parent 71b021c7cc
commit e6401b29e6
10 changed files with 318 additions and 125 deletions

View File

@@ -23,8 +23,10 @@ import org.junit.Test;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.http.client.reactive.MockClientHttpRequest;
import org.springframework.mock.http.client.reactive.MockClientHttpResponse;
import org.springframework.web.reactive.function.client.ClientResponse;
import static junit.framework.TestCase.assertNotNull;
@@ -146,15 +148,14 @@ public class HeaderAssertionsTests {
private HeaderAssertions headerAssertions(HttpHeaders responseHeaders) {
ClientResponse.Headers headers = mock(ClientResponse.Headers.class);
when(headers.asHttpHeaders()).thenReturn(responseHeaders);
ClientResponse response = mock(ClientResponse.class);
when(response.headers()).thenReturn(headers);
MockClientHttpRequest request = new MockClientHttpRequest(HttpMethod.GET, URI.create("/"));
ExchangeResult result = new ExchangeResult(request, response);
MockClientHttpResponse response = new MockClientHttpResponse(HttpStatus.OK);
response.getHeaders().putAll(responseHeaders);
WiretapClientHttpRequest wiretapRequest = new WiretapClientHttpRequest(request);
WiretapClientHttpResponse wiretapResponse = new WiretapClientHttpResponse(response);
ExchangeResult result = new ExchangeResult(wiretapRequest, wiretapResponse);
return new HeaderAssertions(result, mock(WebTestClient.ResponseSpec.class));
}

View File

@@ -23,6 +23,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.mock.http.client.reactive.MockClientHttpRequest;
import org.springframework.mock.http.client.reactive.MockClientHttpResponse;
import org.springframework.web.reactive.function.client.ClientResponse;
import static org.junit.Assert.fail;
@@ -162,17 +163,14 @@ public class StatusAssertionTests {
private StatusAssertions statusAssertions(HttpStatus status) {
ClientResponse.Headers headers = mock(ClientResponse.Headers.class);
when(headers.asHttpHeaders()).thenReturn(new HttpHeaders());
ClientResponse response = mock(ClientResponse.class);
when(response.statusCode()).thenReturn(status);
when(response.headers()).thenReturn(headers);
MockClientHttpRequest request = new MockClientHttpRequest(HttpMethod.GET, URI.create("/"));
ExchangeResult result = new ExchangeResult(request, response);
MockClientHttpResponse response = new MockClientHttpResponse(status);
return new StatusAssertions(result, mock(WebTestClient.ResponseSpec.class));
WiretapClientHttpRequest wiretapRequest = new WiretapClientHttpRequest(request);
WiretapClientHttpResponse wiretapResponse = new WiretapClientHttpResponse(response);
ExchangeResult exchangeResult = new ExchangeResult(wiretapRequest, wiretapResponse);
return new StatusAssertions(exchangeResult, mock(WebTestClient.ResponseSpec.class));
}
}

View File

@@ -36,7 +36,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* Unit tests for {@link WebTestClientConnector}.
* Unit tests for {@link WiretapConnector}.
*
* @author Rossen Stoyanchev
*/
@@ -50,16 +50,16 @@ public class WebTestClientConnectorTests {
ClientHttpConnector connector = (method, uri, fn) -> fn.apply(request).then(Mono.just(response));
ClientRequest clientRequest = ClientRequest.method(HttpMethod.GET, URI.create("/test"))
.header(WebTestClientConnector.REQUEST_ID_HEADER_NAME, "1").build();
.header(WiretapConnector.REQUEST_ID_HEADER_NAME, "1").build();
WebTestClientConnector webTestClientConnector = new WebTestClientConnector(connector);
ExchangeFunction function = ExchangeFunctions.create(webTestClientConnector);
WiretapConnector wiretapConnector = new WiretapConnector(connector);
ExchangeFunction function = ExchangeFunctions.create(wiretapConnector);
function.exchange(clientRequest).blockMillis(0);
ClientHttpRequest actual = webTestClientConnector.claimRequest("1");
ExchangeResult actual = wiretapConnector.claimRequest("1");
assertNotNull(actual);
assertEquals(HttpMethod.GET, actual.getMethod());
assertEquals("/test", actual.getURI().toString());
assertEquals("/test", actual.getUrl().toString());
}
}