首页 > 解决方案 > Spring TestRestTemplate 超时

问题描述

在调试使用 TestRestTemplate(注意:不是 RestTemplate)的 Spring 集成测试时,如果我在生产代码(服务器端)上单步执行断点,我有时会发现测试的客户端超时。

如何更改 Spring TestRestTemplate 的超时?

标签: spring

解决方案


在测试顶部添加一个新的配置类(我称之为 TestConfig):

@SpringBootTest(webEnvironment = ..., classes = [YourApplication, TestConfig])

然后包含该 TestConfig 类
并包含如下自定义 RestTemplateBuilder
如果需要,这些都可以是您的测试类的内部类

public static class TestConfig {
    @Bean
    public MyRestTemplateBuilder myRestTemplateBuilder() {
        return new MyRestTemplateBuilder()
    }
        
}

public static class MyRestTemplateBuilder extends RestTemplateBuilder {
    MyRestTemplateBuilder(RestTemplateCustomizer... customizers) {
        super(customizers)
    }

    @Override
    ClientHttpRequestFactory buildRequestFactory() {
        ClientHttpRequestFactory result = super.buildRequestFactory()
        // Usually result is a: org.springframework.http.client.HttpComponentsClientHttpRequestFactory
        result.setConnectTimeout(100000);
        result.setReadTimeout(100000);
        return result
    }
}

您的超时将根据需要进行修改。

奖励:
对于正常的 RestTemplate 超时,您可以执行以下操作:

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        
        // This code can be used to change the read timeout for testing
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory();
        simpleClientHttpRequestFactory.setReadTimeout(100);  // millis
        
        return restTemplate;
    }

推荐阅读