Merge pull request #34833 from chinmoy12c

* gh-34833:
  Polish "Add content buffering support to MockServerRestTemplateCustomizer"
  Add content buffering support to MockServerRestTemplateCustomizer

Closes gh-34833
This commit is contained in:
Andy Wilkinson 2023-04-17 18:05:28 +01:00
commit a37a7228b8
2 changed files with 40 additions and 2 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2022 the original author or authors.
* Copyright 2012-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -24,7 +24,9 @@ import java.util.function.Supplier;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.test.web.client.MockRestServiceServer.MockRestServiceServerBuilder;
import org.springframework.test.web.client.RequestExpectationManager;
import org.springframework.test.web.client.SimpleRequestExpectationManager;
import org.springframework.util.Assert;
@ -49,6 +51,7 @@ import org.springframework.web.client.RestTemplate;
*
* @author Phillip Webb
* @author Moritz Halbritter
* @author Chinmoy Chakraborty
* @since 1.4.0
* @see #getServer()
* @see #getServer(RestTemplate)
@ -63,6 +66,8 @@ public class MockServerRestTemplateCustomizer implements RestTemplateCustomizer
private boolean detectRootUri = true;
private boolean bufferContent = false;
public MockServerRestTemplateCustomizer() {
this(SimpleRequestExpectationManager::new);
}
@ -96,13 +101,28 @@ public class MockServerRestTemplateCustomizer implements RestTemplateCustomizer
this.detectRootUri = detectRootUri;
}
/**
* Set if the {@link BufferingClientHttpRequestFactory} wrapper should be used to
* buffer the input and output streams, and for example, allow multiple reads of the
* response body.
* @param bufferContent if request and response content should be buffered
* @since 3.1.0
*/
public void setBufferContent(boolean bufferContent) {
this.bufferContent = bufferContent;
}
@Override
public void customize(RestTemplate restTemplate) {
RequestExpectationManager expectationManager = createExpectationManager();
if (this.detectRootUri) {
expectationManager = RootUriRequestExpectationManager.forRestTemplate(restTemplate, expectationManager);
}
MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build(expectationManager);
MockRestServiceServerBuilder serverBuilder = MockRestServiceServer.bindTo(restTemplate);
if (this.bufferContent) {
serverBuilder.bufferContent();
}
MockRestServiceServer server = serverBuilder.build(expectationManager);
this.expectationManagers.put(restTemplate, expectationManager);
this.servers.put(restTemplate, server);
}

View File

@ -22,6 +22,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.test.web.client.RequestExpectationManager;
import org.springframework.test.web.client.SimpleRequestExpectationManager;
import org.springframework.test.web.client.UnorderedRequestExpectationManager;
@ -104,7 +106,23 @@ class MockServerRestTemplateCustomizerTests {
this.customizer.customize(new RestTemplateBuilder().rootUri("https://example.com").build());
assertThat(this.customizer.getServer()).extracting("expectationManager")
.isInstanceOf(SimpleRequestExpectationManager.class);
}
@Test
void bufferContentShouldDefaultToFalse() {
MockServerRestTemplateCustomizer customizer = new MockServerRestTemplateCustomizer();
RestTemplate restTemplate = new RestTemplate();
customizer.customize(restTemplate);
assertThat(restTemplate.getRequestFactory()).isInstanceOf(ClientHttpRequestFactory.class);
}
@Test
void setBufferContentShouldEnableContentBuffering() {
MockServerRestTemplateCustomizer customizer = new MockServerRestTemplateCustomizer();
RestTemplate restTemplate = new RestTemplate();
customizer.setBufferContent(true);
customizer.customize(restTemplate);
assertThat(restTemplate.getRequestFactory()).isInstanceOf(BufferingClientHttpRequestFactory.class);
}
@Test