From 17ab8bd83480a5b146abdf6aae96e4c23990d505 Mon Sep 17 00:00:00 2001 From: Dmytro Nosan Date: Mon, 18 Mar 2019 16:00:51 +0200 Subject: [PATCH] Use the same request factory (if possible) when creating a new `TestRestTemplate` with a `withBasicAuth`. gh-15443 --- .../test/web/client/TestRestTemplate.java | 24 +++++++++++++++++-- .../web/client/TestRestTemplateTests.java | 16 ++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java index 4f16e60ecdf9..dfc3d6a0fe8e 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; import org.apache.http.client.HttpClient; import org.apache.http.client.config.CookieSpecs; @@ -38,6 +39,9 @@ import org.apache.http.protocol.HttpContext; import org.apache.http.ssl.SSLContextBuilder; +import org.springframework.beans.BeanInstantiationException; +import org.springframework.beans.BeanUtils; +import org.springframework.boot.web.client.ClientHttpRequestFactorySupplier; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.boot.web.client.RootUriTemplateHandler; import org.springframework.core.ParameterizedTypeReference; @@ -1023,7 +1027,10 @@ public RestTemplate getRestTemplate() { /** * Creates a new {@code TestRestTemplate} with the same configuration as this one, * except that it will send basic authorization headers using the given - * {@code username} and {@code password}. + * {@code username} and {@code password}. Note, that a new instance of + * {@link ClientHttpRequestFactory} will be created (if possible) based on the current + * factory class, otherwise {@link ClientHttpRequestFactorySupplier} will be used to + * instantiate a {@link ClientHttpRequestFactory}. * @param username the username * @param password the password * @return the new template @@ -1031,6 +1038,7 @@ public RestTemplate getRestTemplate() { */ public TestRestTemplate withBasicAuth(String username, String password) { RestTemplate restTemplate = new RestTemplateBuilder() + .requestFactory(getRequestFactorySupplier()) .messageConverters(getRestTemplate().getMessageConverters()) .interceptors(getRestTemplate().getInterceptors()) .uriTemplateHandler(getRestTemplate().getUriTemplateHandler()).build(); @@ -1038,6 +1046,18 @@ public TestRestTemplate withBasicAuth(String username, String password) { this.httpClientOptions); } + private Supplier getRequestFactorySupplier() { + return () -> { + try { + return BeanUtils + .instantiateClass(getRequestFactoryClass(getRestTemplate())); + } + catch (BeanInstantiationException ex) { + return new ClientHttpRequestFactorySupplier().get(); + } + }; + } + @SuppressWarnings({ "rawtypes", "unchecked" }) private RequestEntity createRequestEntityWithRootAppliedUri( RequestEntity requestEntity) { diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java index 65b84fb9961f..187f183dc4e4 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. @@ -93,6 +93,20 @@ public void doNotReplaceCustomRequestFactory() { .isInstanceOf(OkHttp3ClientHttpRequestFactory.class); } + @Test + public void useTheSameRequestFactoryClassWithBasicAuth() { + OkHttp3ClientHttpRequestFactory customFactory = new OkHttp3ClientHttpRequestFactory(); + RestTemplateBuilder builder = new RestTemplateBuilder() + .requestFactory(OkHttp3ClientHttpRequestFactory::new); + TestRestTemplate testRestTemplate = new TestRestTemplate(builder) + .withBasicAuth("test", "test"); + RestTemplate restTemplate = testRestTemplate.getRestTemplate(); + Object requestFactory = ReflectionTestUtils + .getField(restTemplate.getRequestFactory(), "requestFactory"); + assertThat(requestFactory).isNotEqualTo(customFactory) + .hasSameClassAs(customFactory); + } + @Test public void getRootUriRootUriSetViaRestTemplateBuilder() { String rootUri = "http://example.com";