如何将TestRestTemplate.HttpClientOption.ENABLE_REDIRECTS
和TestRestTemplate.HttpClientOption.ENABLE_COOKIES
添加到Spring-boots TestRestTemplate中?
我正在使用spring-boot,因此请自动为我配置TestRestTemplate。
我可以在使用RestTemplateBuilder
创建之前自定义此bean。问题是我看不到如何添加这些选项:
@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder()
.errorHandler(new ResponseErrorHandler() {
...
});
}
documentation有一些接受这些选项的构造函数,但问题是已经为我创建了bean。
答案 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());
}
}