如何覆盖Spring Test默认TestRestTemplate的读取超时时间?
解决Spring Boot测试中TestRestTemplate读取超时问题
以下两种方法可以简单修改TestRestTemplate的读取超时,同时保留应用中的自定义MessageConverter:
方法一:在测试初始化阶段直接修改已注入的TestRestTemplate
不需要额外配置类,直接在测试前置方法中调整底层请求工厂的超时参数,完全保留原有配置(包括自定义转换器):
import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; public class YourRestServiceTest { @Autowired private TestRestTemplate testRestTemplate; @BeforeEach void setUp() { // 获取TestRestTemplate底层的请求工厂 SimpleClientHttpRequestFactory requestFactory = (SimpleClientHttpRequestFactory) testRestTemplate.getRestTemplate().getRequestFactory(); // 设置读取超时为5分钟(毫秒单位) requestFactory.setReadTimeout(5 * 60 * 1000); // 可选:设置连接超时为1分钟 requestFactory.setConnectTimeout(60 * 1000); } // 测试方法... }
方法二:自定义TestRestTemplate Bean,复用自动配置的MessageConverters
通过配置类构建带超时的TestRestTemplate,同时复用Spring Boot自动加载的所有转换器:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import java.time.Duration; @TestConfiguration public class TestRestTemplateConfig { @Autowired private RestTemplateBuilder restTemplateBuilder; @Bean public TestRestTemplate testRestTemplate() { // 获取自动配置的所有MessageConverter var messageConverters = restTemplateBuilder.build().getMessageConverters(); // 构建带超时的TestRestTemplate并添加原有转换器 return new TestRestTemplate( restTemplateBuilder .setReadTimeout(Duration.ofMinutes(5)) .setConnectTimeout(Duration.ofMinutes(1)) .additionalMessageConverters(messageConverters) .build() ); } }
在测试类中导入该配置即可:
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Import(TestRestTemplateConfig.class) public class YourRestServiceTest { @Autowired private TestRestTemplate testRestTemplate; // 测试方法... }
补充说明
- 直接重写
RestTemplateBuilderBean会覆盖自动配置实例,导致丢失自定义MessageConverter——自动配置的RestTemplateBuilder会自动收集容器中的所有HttpMessageConverter,而手动新建的Builder默认不会做这件事。 sun.net.client.defaultReadTimeout参数仅对JDK原生HttpURLConnection生效,若Spring Boot自动切换了其他请求工厂(比如Apache HttpClient),该参数会失效。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

