簡體   English   中英

無法自動連接合格者標記的單元測試中的RestTemplate

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM