You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何覆盖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;

    // 测试方法...
}

补充说明

  • 直接重写RestTemplateBuilder Bean会覆盖自动配置实例,导致丢失自定义MessageConverter——自动配置的RestTemplateBuilder会自动收集容器中的所有HttpMessageConverter,而手动新建的Builder默认不会做这件事。
  • sun.net.client.defaultReadTimeout参数仅对JDK原生HttpURLConnection生效,若Spring Boot自动切换了其他请求工厂(比如Apache HttpClient),该参数会失效。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:10:05