[英]Cannot Autowire Qualifier tagged RestTemplate from unit test
我在Web應用程序中使用了遠程api。 某些端點在我使用的API中需要身份驗證標頭。 由於這種需要,我在配置類中創建了兩個不同的RestTemplateBuilder bean。
@Configuration
public class RestTemplateConfiguration {
@Bean
@DependsOn(value = {"secureRestTemplateCustomizer"})
@Qualifier("secureRestTemplateBuilder")
public RestTemplateBuilder secureRestTemplateBuilder() {
return new RestTemplateBuilder(secureRestTemplateCustomizer());
}
@Bean
@DependsOn(value = {"publicRestTemplateCustomizer"})
@Qualifier("publicRestTemplateBuilder")
public RestTemplateBuilder publicRestTemplateBuilder() {
return new RestTemplateBuilder(publicRestTemplateCustomizer());
}
@Bean
@Qualifier("secureRestTemplateCustomizer")
public SecureRestTemplateCustomizer secureRestTemplateCustomizer() {
return new SecureRestTemplateCustomizer();
}
@Bean
@Qualifier("publicRestTemplateCustomizer")
public PublicRestTemplateCustomizer publicRestTemplateCustomizer() {
return new PublicRestTemplateCustomizer();
}
}
這些是我自定義的RestTemplateCustomizers
@Component
public class SecureRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
restTemplate.setErrorHandler(new ErrorHandler());
restTemplate.getInterceptors().add(new AuthorizationHeaderInterceptor());
}
}
PublicRestTemplateCustomizer
@Component
public class PublicRestTemplateCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
restTemplate.setErrorHandler(new ErrorHandler());
}
}
當我想在如下所示的api客戶端中使用這些RestTemplateBuilder
時,沒有問題。 Spring可以將它們自動連接到我的api客戶端構造函數中。
private RestTemplate restTemplate;
@Autowired
public LoginApiClient(@Qualifier("publicRestTemplateBuilder") RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
但是在我的單元測試中,這種用法引發了一個錯誤,例如
創建文件[.. \\ LoginApiClient.class]中定義的名稱為'loginApiClient'的bean時出錯:通過構造函數參數0表示的不滿意的依賴關系; 嵌套的異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有類型為“ org.springframework.boot.web.client.RestTemplateBuilder”的合格Bean:應該至少有1個有資格作為自動裝配候選的Bean。 依賴項注釋:{@ org.springframework.beans.factory.annotation.Qualifier(value = publicRestTemplateBuilder)}
@RunWith(SpringRunner.class)
@RestClientTest({LoginApiClient.class})
@Category(IUnitTest.class)
public class LoginApiClientTest {
@Autowired ILoginApiClient loginApiClient;
@Autowired private MockRestServiceServer server;
@Test
public void validateToken_returns_true_for_valid_token() throws Exception{
String token = "token";
this.server.expect(requestTo(this.validateTokenUrl))
.andExpect(method(HttpMethod.POST))
.andRespond(withSuccess(objectMapper.writeValueAsString(validTokenResponse(token)), MediaType
.APPLICATION_JSON));
Boolean isValid = loginApiClient.validateToken(token);
server.verify();
assertThat(isValid,is(equalTo(true)));
}
}
我如何才能真正模擬這些RestTemplate並在單元測試中使用。
我認為您在主應用程序類中缺少@ComponentScan(value =“ your.package”)
您沒有指定上下文。
嘗試將此注釋添加到您的測試類中:
@ContextConfiguration(classes=RestTemplateConfiguration.class, loader=AnnotationConfigContextLoader.class)
有關詳細信息,請參見本文: spring-3-1-m2-testing-with-configuration-classes-and-profiles-適用於Spring 3,但較新版本的Spring的工作原理類似。
這是更新的教程: junit-spring-integration-example
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.