在TestRestTemplate中启用Cookie和重定向

时间:2017-10-17 05:03:27

标签: spring spring-boot spring-test

如何将TestRestTemplate.HttpClientOption.ENABLE_REDIRECTSTestRestTemplate.HttpClientOption.ENABLE_COOKIES添加到Spring-boots TestRestTemplate中?

我正在使用spring-boot,因此请自动为我配置TestRestTemplate。

我可以在使用RestTemplateBuilder创建之前自定义此bean。问题是我看不到如何添加这些选项:

    @Bean
    public RestTemplateBuilder restTemplateBuilder() {
        return new RestTemplateBuilder()
                .errorHandler(new ResponseErrorHandler() {
                    ...
                });
    } 

documentation有一些接受这些选项的构造函数,但问题是已经为我创建了bean。

1 个答案:

答案 0 :(得分:2)

您可以使用TestRestTemplate注释创建@Bean并将其呈现给Spring。

例如:

@Bean
@Primary
public TestRestTemplate testRestTemplate() {
    RestTemplate restTemplate = new RestTemplateBuilder()
            .errorHandler(new ResponseErrorHandler() {
                @Override
                public boolean hasError(ClientHttpResponse response) throws IOException {
                    return false;
                }

                @Override
                public void handleError(ClientHttpResponse response) throws IOException {

                }
            }).build();

    return new TestRestTemplate(restTemplate, user, password, TestRestTemplate.HttpClientOption.ENABLE_REDIRECTS, TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
}

或者,如果您不需要自定义RestTemplate,请使用以下构造函数(内部实例为RestTemplate):

@Bean
@Primary
public TestRestTemplate testRestTemplate() {
    return new TestRestTemplate(TestRestTemplate.HttpClientOption.ENABLE_REDIRECTS, TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
}

更新1 以解决此评论:

  

当我运行测试时,我现在收到以下错误org.apache.http.ProtocolException: Target host is not specified

Spring提供的TestRestTemplate配置为解析相对于http://localhost:${local.server.port}的路径。因此,当您使用自己的实例替换Spring提供的实例时,您必须提供完整的地址(包括主机和端口)或使用TestRestTemplate配置您自己的LocalHostUriTemplateHandler(您可以在org.springframework.boot.test.context.SpringBootTestContextCustomizer.TestRestTemplateFactory中查看此代码。这是后一种方法的一个例子:

@Bean
@Primary
public TestRestTemplate testRestTemplate(ApplicationContext applicationContext) {
    RestTemplate restTemplate = new RestTemplateBuilder()
            .errorHandler(new ResponseErrorHandler() {
                @Override
                public boolean hasError(ClientHttpResponse response) throws IOException {
                    return false;
                }

                @Override
                public void handleError(ClientHttpResponse response) throws IOException {

                }
            }).build();

    TestRestTemplate testRestTemplate =
            new TestRestTemplate(restTemplate, user, password, TestRestTemplate.HttpClientOption
                    .ENABLE_REDIRECTS, TestRestTemplate.HttpClientOption.ENABLE_COOKIES);

    // let this testRestTemplate resolve paths relative to http://localhost:${local.server.port}
    LocalHostUriTemplateHandler handler =
            new LocalHostUriTemplateHandler(applicationContext.getEnvironment(), "http");
    testRestTemplate.setUriTemplateHandler(handler);

    return testRestTemplate;
}

使用此bean配置,以下测试用例使用自定义TestRestTemplate并成功调用localhost上的Spring Boot应用程序:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestTemplateTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void test() {
        ResponseEntity<String> forEntity = this.restTemplate.getForEntity("/some/endpoint", String.class);
        System.out.println(forEntity.getBody());
    }
}