春季:如何将@RestClientTest与带有@Qualifier的RestTemplate结合使用?

时间:2019-04-16 12:42:53

标签: java spring spring-boot spring-boot-test qualifiers

我已经更改了使用RestTemplate来使用@Qualifier的Spring Boot(2.1.4)服务。现在,我的测试(使用@RestClientTest@AutoConfigureWebClient)失败了,因为它无法解析bean。

我该如何解决?

配置:

  @Bean
  @Qualifier("eureka")
  @LoadBalanced
  RestTemplate eurekaRestTemplate() {

服务:

  public ClarkClient(
      @Qualifier("eureka") RestTemplate restTemplate, ClarkConfiguration configuration)
      throws URISyntaxException {

测试:

@ExtendWith({SpringExtension.class, MockitoExtension.class})
@RestClientTest({CastorClient.class, CastorConfiguration.class})
@AutoConfigureWebClient(registerRestTemplate = true)
class CastorClientWebTest {

  @Autowired
  private CastorClient cut;

  @Autowired
  private MockRestServiceServer server;

错误:

[2019-04-16T14:02:22,614] [WARN ] [            ....AnnotationConfigApplicationContext] [refresh 557] : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'castorClient' defined in file [/home/martinsc/java/routing/route-testing-batch-manager/out/production/classes/com/tyntec/routetesting/batchmanager/core/clients/CastorClient.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=eureka)}

2 个答案:

答案 0 :(得分:1)

您不应使用(registerRestTemplate = true),因为它会为您创建一个RestTemplate bean,而不是您使用的那个。

如果您的CastorConfiguration中声明了合格的RestTemplate bean,请尝试使用@Import(CastorConfiguration.class)

答案 1 :(得分:0)

对我有用的解决方案:@AutoConfigureWebClient(无(registerRestTemplate = true))。 在@TestConfiguration类中,使用正确的RestTemplate

创建一个@Qualifier的bean。
@Bean
@Qualifier("eureka")
public RestTemplate eurekaRestTemplate() {
  return new RestTemplate();
}

将其注入测试类

@Autowired
@Qualifier("eureka")
private RestTemplate restTemplate;

现在,我们需要将其连接到MockRestServiceServer中。我们通过@BeforeEach

private MockRestServiceServer server;
@BeforeEach
  void setUp () {
    server = MockRestServiceServer.bindTo(restTemplate).build();
  }