diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapter.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapter.java new file mode 100644 index 000000000..42137fe62 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapter.java @@ -0,0 +1,92 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.circuitbreaker; + +import java.util.List; +import java.util.Objects; + +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +/** + * Abstract Polaris Circuit-Break Adapter . + * + * @author Elve.Xu 2022-07-11 + */ +public abstract class AbstractPolarisCircuitBreakAdapter { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractPolarisCircuitBreakAdapter.class); + + protected final PolarisCircuitBreakerProperties properties; + + /** + * Constructor With {@link PolarisCircuitBreakerProperties} . + * + * @param properties instance of {@link PolarisCircuitBreakerProperties}. + */ + protected AbstractPolarisCircuitBreakAdapter(PolarisCircuitBreakerProperties properties) { + this.properties = properties; + } + + /** + * Callback after completion of request processing, Check if business meltdown reporting is required. + * + * @param httpStatus request http status code + * @return true , otherwise return false . + */ + protected boolean apply(@Nullable HttpStatus httpStatus) { + if (Objects.isNull(httpStatus)) { + return false; + } + else { + // statuses > series + List status = properties.getStatuses(); + + if (status.isEmpty()) { + List series = properties.getSeries(); + // Check INTERNAL_SERVER_ERROR (500) status. + if (properties.getIgnoreInternalServerError() && Objects.equals(httpStatus, INTERNAL_SERVER_ERROR)) { + return false; + } + if (series.isEmpty()) { + return false; + } + else { + try { + return series.contains(HttpStatus.Series.valueOf(httpStatus)); + } + catch (Exception e) { + LOG.warn("Decode http status failed.", e); + } + } + } + else { + // Use the user-specified fuse status code. + return status.contains(httpStatus); + } + } + // DEFAULT RETURN FALSE. + return false; + } +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java index 4f4291a83..31b11ccc2 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java @@ -89,8 +89,9 @@ public class PolarisCircuitBreakerAutoConfiguration { @Bean public PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler( - ConsumerAPI consumerAPI, @Autowired(required = false) PolarisResponseErrorHandler polarisResponseErrorHandler) { - return new PolarisRestTemplateResponseErrorHandler(consumerAPI, polarisResponseErrorHandler); + PolarisCircuitBreakerProperties properties, ConsumerAPI consumerAPI, + @Autowired(required = false) PolarisResponseErrorHandler polarisResponseErrorHandler) { + return new PolarisRestTemplateResponseErrorHandler(properties, consumerAPI, polarisResponseErrorHandler); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java index 12fd57dcd..a47ad20a7 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java @@ -21,8 +21,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.google.common.collect.Lists; - import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpStatus; @@ -54,7 +52,7 @@ public class PolarisCircuitBreakerProperties { /** * Specify the Http status code(s) that needs to be fused. */ - private List statuses = Lists.newArrayList(NOT_IMPLEMENTED, BAD_GATEWAY, + private List statuses = toList(NOT_IMPLEMENTED, BAD_GATEWAY, SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, HTTP_VERSION_NOT_SUPPORTED, VARIANT_ALSO_NEGOTIATES, INSUFFICIENT_STORAGE, LOOP_DETECTED, BANDWIDTH_LIMIT_EXCEEDED, NOT_EXTENDED, NETWORK_AUTHENTICATION_REQUIRED); @@ -63,14 +61,53 @@ public class PolarisCircuitBreakerProperties { */ private List series = toList(HttpStatus.Series.SERVER_ERROR); + /** + * Ignore Internal Server Error Http Status Code, + * Only takes effect if the attribute {@link PolarisCircuitBreakerProperties#series} is not empty. + */ + private Boolean ignoreInternalServerError = true; + /** * Convert items to List. + * * @param items item arrays - * @param Object Generics. + * @param Object Generics. * @return list */ @SafeVarargs private static List toList(T... items) { return new ArrayList<>(Arrays.asList(items)); } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + this.statuses = statuses; + } + + public List getSeries() { + return series; + } + + public void setSeries(List series) { + this.series = series; + } + + public Boolean getIgnoreInternalServerError() { + return ignoreInternalServerError; + } + + public void setIgnoreInternalServerError(Boolean ignoreInternalServerError) { + this.ignoreInternalServerError = ignoreInternalServerError; + } } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignBeanPostProcessor.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignBeanPostProcessor.java index ea8242587..63615025a 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignBeanPostProcessor.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignBeanPostProcessor.java @@ -17,6 +17,7 @@ package com.tencent.cloud.polaris.circuitbreaker.feign; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.polaris.api.core.ConsumerAPI; import feign.Client; @@ -29,6 +30,7 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; +import org.springframework.lang.NonNull; /** * Wrap Spring Bean and decorating proxy for Feign Client. @@ -46,7 +48,7 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac } @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException { return wrapper(bean); } @@ -77,11 +79,11 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac } private PolarisFeignClient createPolarisFeignClient(Client delegate) { - return new PolarisFeignClient(delegate, consumerAPI); + return new PolarisFeignClient(delegate, consumerAPI, factory.getBean(PolarisCircuitBreakerProperties.class)); } @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException { this.factory = beanFactory; } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClient.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClient.java index 0c8551404..b8ae3cbd6 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClient.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClient.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.net.URI; import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.polaris.circuitbreaker.AbstractPolarisCircuitBreakAdapter; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.ServiceKey; @@ -34,6 +36,8 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; + import static feign.Util.checkNotNull; /** @@ -41,7 +45,7 @@ import static feign.Util.checkNotNull; * * @author Haotian Zhang */ -public class PolarisFeignClient implements Client { +public class PolarisFeignClient extends AbstractPolarisCircuitBreakAdapter implements Client { private static final Logger LOG = LoggerFactory.getLogger(PolarisFeignClient.class); @@ -49,7 +53,8 @@ public class PolarisFeignClient implements Client { private final ConsumerAPI consumerAPI; - public PolarisFeignClient(Client target, ConsumerAPI consumerAPI) { + public PolarisFeignClient(Client target, ConsumerAPI consumerAPI, PolarisCircuitBreakerProperties properties) { + super(properties); this.delegate = checkNotNull(target, "target"); this.consumerAPI = checkNotNull(consumerAPI, "CircuitBreakAPI"); } @@ -60,7 +65,7 @@ public class PolarisFeignClient implements Client { try { Response response = delegate.execute(request, options); // HTTP code greater than 500 is an exception - if (response.status() > 500) { + if (super.apply(HttpStatus.resolve(response.status()))) { resultRequest.setRetStatus(RetStatus.RetFail); } LOG.debug("Will report result of {}. Request=[{}]. Response=[{}].", diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandler.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandler.java index 4adf0bac2..55e5c42cf 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandler.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandler.java @@ -25,6 +25,8 @@ import java.util.Objects; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.util.ReflectionUtils; +import com.tencent.cloud.polaris.circuitbreaker.AbstractPolarisCircuitBreakAdapter; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.ServiceKey; @@ -43,7 +45,7 @@ import org.springframework.web.client.ResponseErrorHandler; * * @author wh 2022/6/21 */ -public class PolarisRestTemplateResponseErrorHandler implements ResponseErrorHandler { +public class PolarisRestTemplateResponseErrorHandler extends AbstractPolarisCircuitBreakAdapter implements ResponseErrorHandler { private static final Logger LOG = LoggerFactory.getLogger(PolarisRestTemplateResponseErrorHandler.class); @@ -53,9 +55,10 @@ public class PolarisRestTemplateResponseErrorHandler implements ResponseErrorHan private final PolarisResponseErrorHandler polarisResponseErrorHandler; - - public PolarisRestTemplateResponseErrorHandler(ConsumerAPI consumerAPI, + public PolarisRestTemplateResponseErrorHandler( + PolarisCircuitBreakerProperties properties, ConsumerAPI consumerAPI, PolarisResponseErrorHandler polarisResponseErrorHandler) { + super(properties); this.consumerAPI = consumerAPI; this.polarisResponseErrorHandler = polarisResponseErrorHandler; } @@ -86,7 +89,7 @@ public class PolarisRestTemplateResponseErrorHandler implements ResponseErrorHan resultRequest.setPort(realURL.getPort()); } - if (response.getStatusCode().value() > 500) { + if (super.apply(response.getStatusCode())) { resultRequest.setRetStatus(RetStatus.RetFail); } } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapterTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapterTest.java new file mode 100644 index 000000000..0775c8313 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/AbstractPolarisCircuitBreakAdapterTest.java @@ -0,0 +1,117 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.circuitbreaker; + +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import org.springframework.http.HttpStatus; + +/** + * Test For {@link AbstractPolarisCircuitBreakAdapter}. + * + * @author Elve.Xu + * @version ${project.version} - 2022/7/11 + */ +public class AbstractPolarisCircuitBreakAdapterTest { + + @Test + public void testApplyWithDefaultConfig() { + PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties(); + // Mock Condition + SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties); + + // Assert + Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithoutIgnoreInternalServerError() { + PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.setIgnoreInternalServerError(false); + + SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties); + + // Assert + Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(true); + Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithIgnoreInternalServerError() { + PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.setIgnoreInternalServerError(true); + + SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties); + + // Assert + Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithoutSeries() { + PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + + SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties); + + // Assert + Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); + } + + @Test + public void testApplyWithSeries() { + PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); + + SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties); + + // Assert + Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); + Assertions.assertThat(adapter.apply(HttpStatus.FORBIDDEN)).isEqualTo(true); + } + + /** + * Simple Polaris CircuitBreak Adapter Implements . + */ + public static class SimplePolarisCircuitBreakAdapter extends AbstractPolarisCircuitBreakAdapter { + + public SimplePolarisCircuitBreakAdapter(PolarisCircuitBreakerProperties properties) { + super(properties); + } + } +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClientTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClientTest.java index 8d21f6a1e..a389b0a86 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClientTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignClientTest.java @@ -20,6 +20,7 @@ package com.tencent.cloud.polaris.circuitbreaker.feign; import java.io.IOException; import com.google.common.collect.Maps; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.rpc.ServiceCallResult; import feign.Client; @@ -30,6 +31,7 @@ import feign.Target; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @@ -52,10 +54,13 @@ import static org.mockito.Mockito.mock; properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"}) public class PolarisFeignClientTest { + @Autowired + private PolarisCircuitBreakerProperties properties; + @Test public void testConstructor() { try { - new PolarisFeignClient(null, null); + new PolarisFeignClient(null, null, properties); fail("NullPointerException should be thrown."); } catch (Throwable e) { @@ -64,7 +69,7 @@ public class PolarisFeignClientTest { } try { - new PolarisFeignClient(mock(Client.class), null); + new PolarisFeignClient(mock(Client.class), null, properties); fail("NullPointerException should be thrown."); } catch (Throwable e) { @@ -73,7 +78,7 @@ public class PolarisFeignClientTest { } try { - assertThat(new PolarisFeignClient(mock(Client.class), mock(ConsumerAPI.class))) + assertThat(new PolarisFeignClient(mock(Client.class), mock(ConsumerAPI.class), properties)) .isInstanceOf(PolarisFeignClient.class); } catch (Throwable e) { @@ -107,7 +112,7 @@ public class PolarisFeignClientTest { RequestTemplate requestTemplate = new RequestTemplate(); requestTemplate.feignTarget(target); - PolarisFeignClient polarisFeignClient = new PolarisFeignClient(delegate, consumerAPI); + PolarisFeignClient polarisFeignClient = new PolarisFeignClient(delegate, consumerAPI, properties); // 200 Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test", diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandlerTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandlerTest.java index 6cb630e37..ee1b2854c 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandlerTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisRestTemplateResponseErrorHandlerTest.java @@ -22,10 +22,12 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.polaris.api.core.ConsumerAPI; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpMethod; @@ -44,10 +46,14 @@ import static org.mockito.Mockito.when; properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"}) public class PolarisRestTemplateResponseErrorHandlerTest { + @Autowired + private PolarisCircuitBreakerProperties properties; + @Test public void handleError() throws Exception { ConsumerAPI consumerAPI = mock(ConsumerAPI.class); - PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler = new PolarisRestTemplateResponseErrorHandler(consumerAPI, null); + PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler = + new PolarisRestTemplateResponseErrorHandler(properties, consumerAPI, null); URI uri = mock(URI.class); when(uri.getPath()).thenReturn("/test"); when(uri.getHost()).thenReturn("host");