您可以創建一個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提供的實例時,您需要提供完整的地址(包括主機和端口)或者配置LocalHostUriTemplateHandler
(您可以在org.springframework.boot.test.context.SpringBootTestContextCustomizer.TestRestTemplateFactory
中看到此代碼)來配置您自己的TestRestTemplate
。下面是後一種方法的一個例子:
@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
併成功調用本地主機上的春天啓動的應用程序:
@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());
}
}
這將導致更多的問題。首先,我需要在'testRestTemplate()'中添加'@ Primary',另外註冊兩個bean。其次,當我運行測試時,我現在得到以下錯誤:org.apache.http.ProtocolException:未指定目標主機。我認爲在創建TestRestTemplate時,spring-boot會有更多的魔力。 – jax
@jax道歉,我已經更新了這個問題,以澄清如何使用定製的'TestRestTemplate'以及如何使用它,就像你使用Spring提供的'TestRestTemplate'一樣。 – glytching