Add unit test case.

pull/424/head
misselvexu 3 years ago
parent 41e1b049b7
commit d53186bb45

@ -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 <a href="mailto:iskp.me@gmail.com">Elve.Xu</a> 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<HttpStatus> status = properties.getStatuses();
if (status.isEmpty()) {
List<HttpStatus.Series> 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;
}
}

@ -89,8 +89,9 @@ public class PolarisCircuitBreakerAutoConfiguration {
@Bean @Bean
public PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler( public PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler(
ConsumerAPI consumerAPI, @Autowired(required = false) PolarisResponseErrorHandler polarisResponseErrorHandler) { PolarisCircuitBreakerProperties properties, ConsumerAPI consumerAPI,
return new PolarisRestTemplateResponseErrorHandler(consumerAPI, polarisResponseErrorHandler); @Autowired(required = false) PolarisResponseErrorHandler polarisResponseErrorHandler) {
return new PolarisRestTemplateResponseErrorHandler(properties, consumerAPI, polarisResponseErrorHandler);
} }
@Bean @Bean

@ -21,8 +21,6 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import com.google.common.collect.Lists;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -54,7 +52,7 @@ public class PolarisCircuitBreakerProperties {
/** /**
* Specify the Http status code(s) that needs to be fused. * Specify the Http status code(s) that needs to be fused.
*/ */
private List<HttpStatus> statuses = Lists.newArrayList(NOT_IMPLEMENTED, BAD_GATEWAY, private List<HttpStatus> statuses = toList(NOT_IMPLEMENTED, BAD_GATEWAY,
SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, HTTP_VERSION_NOT_SUPPORTED, VARIANT_ALSO_NEGOTIATES, SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, HTTP_VERSION_NOT_SUPPORTED, VARIANT_ALSO_NEGOTIATES,
INSUFFICIENT_STORAGE, LOOP_DETECTED, BANDWIDTH_LIMIT_EXCEEDED, NOT_EXTENDED, NETWORK_AUTHENTICATION_REQUIRED); INSUFFICIENT_STORAGE, LOOP_DETECTED, BANDWIDTH_LIMIT_EXCEEDED, NOT_EXTENDED, NETWORK_AUTHENTICATION_REQUIRED);
@ -63,14 +61,53 @@ public class PolarisCircuitBreakerProperties {
*/ */
private List<HttpStatus.Series> series = toList(HttpStatus.Series.SERVER_ERROR); private List<HttpStatus.Series> 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. * Convert items to List.
*
* @param items item arrays * @param items item arrays
* @param <T> Object Generics. * @param <T> Object Generics.
* @return list * @return list
*/ */
@SafeVarargs @SafeVarargs
private static <T> List<T> toList(T... items) { private static <T> List<T> toList(T... items) {
return new ArrayList<>(Arrays.asList(items)); return new ArrayList<>(Arrays.asList(items));
} }
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public List<HttpStatus> getStatuses() {
return statuses;
}
public void setStatuses(List<HttpStatus> statuses) {
this.statuses = statuses;
}
public List<HttpStatus.Series> getSeries() {
return series;
}
public void setSeries(List<HttpStatus.Series> series) {
this.series = series;
}
public Boolean getIgnoreInternalServerError() {
return ignoreInternalServerError;
}
public void setIgnoreInternalServerError(Boolean ignoreInternalServerError) {
this.ignoreInternalServerError = ignoreInternalServerError;
}
} }

@ -17,6 +17,7 @@
package com.tencent.cloud.polaris.circuitbreaker.feign; package com.tencent.cloud.polaris.circuitbreaker.feign;
import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties;
import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ConsumerAPI;
import feign.Client; 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.loadbalancer.FeignBlockingLoadBalancerClient;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.lang.NonNull;
/** /**
* Wrap Spring Bean and decorating proxy for Feign Client. * Wrap Spring Bean and decorating proxy for Feign Client.
@ -46,7 +48,7 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac
} }
@Override @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
return wrapper(bean); return wrapper(bean);
} }
@ -77,11 +79,11 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac
} }
private PolarisFeignClient createPolarisFeignClient(Client delegate) { private PolarisFeignClient createPolarisFeignClient(Client delegate) {
return new PolarisFeignClient(delegate, consumerAPI); return new PolarisFeignClient(delegate, consumerAPI, factory.getBean(PolarisCircuitBreakerProperties.class));
} }
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory; this.factory = beanFactory;
} }

@ -22,6 +22,8 @@ import java.io.IOException;
import java.net.URI; import java.net.URI;
import com.tencent.cloud.common.metadata.MetadataContext; 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.core.ConsumerAPI;
import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.RetStatus;
import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.ServiceKey;
@ -34,6 +36,8 @@ import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import static feign.Util.checkNotNull; import static feign.Util.checkNotNull;
/** /**
@ -41,7 +45,7 @@ import static feign.Util.checkNotNull;
* *
* @author Haotian Zhang * @author Haotian Zhang
*/ */
public class PolarisFeignClient implements Client { public class PolarisFeignClient extends AbstractPolarisCircuitBreakAdapter implements Client {
private static final Logger LOG = LoggerFactory.getLogger(PolarisFeignClient.class); private static final Logger LOG = LoggerFactory.getLogger(PolarisFeignClient.class);
@ -49,7 +53,8 @@ public class PolarisFeignClient implements Client {
private final ConsumerAPI consumerAPI; 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.delegate = checkNotNull(target, "target");
this.consumerAPI = checkNotNull(consumerAPI, "CircuitBreakAPI"); this.consumerAPI = checkNotNull(consumerAPI, "CircuitBreakAPI");
} }
@ -60,7 +65,7 @@ public class PolarisFeignClient implements Client {
try { try {
Response response = delegate.execute(request, options); Response response = delegate.execute(request, options);
// HTTP code greater than 500 is an exception // HTTP code greater than 500 is an exception
if (response.status() > 500) { if (super.apply(HttpStatus.resolve(response.status()))) {
resultRequest.setRetStatus(RetStatus.RetFail); resultRequest.setRetStatus(RetStatus.RetFail);
} }
LOG.debug("Will report result of {}. Request=[{}]. Response=[{}].", LOG.debug("Will report result of {}. Request=[{}]. Response=[{}].",

@ -25,6 +25,8 @@ import java.util.Objects;
import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.util.ReflectionUtils; 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.core.ConsumerAPI;
import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.RetStatus;
import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.ServiceKey;
@ -43,7 +45,7 @@ import org.springframework.web.client.ResponseErrorHandler;
* *
* @author wh 2022/6/21 * @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); private static final Logger LOG = LoggerFactory.getLogger(PolarisRestTemplateResponseErrorHandler.class);
@ -53,9 +55,10 @@ public class PolarisRestTemplateResponseErrorHandler implements ResponseErrorHan
private final PolarisResponseErrorHandler polarisResponseErrorHandler; private final PolarisResponseErrorHandler polarisResponseErrorHandler;
public PolarisRestTemplateResponseErrorHandler(
public PolarisRestTemplateResponseErrorHandler(ConsumerAPI consumerAPI, PolarisCircuitBreakerProperties properties, ConsumerAPI consumerAPI,
PolarisResponseErrorHandler polarisResponseErrorHandler) { PolarisResponseErrorHandler polarisResponseErrorHandler) {
super(properties);
this.consumerAPI = consumerAPI; this.consumerAPI = consumerAPI;
this.polarisResponseErrorHandler = polarisResponseErrorHandler; this.polarisResponseErrorHandler = polarisResponseErrorHandler;
} }
@ -86,7 +89,7 @@ public class PolarisRestTemplateResponseErrorHandler implements ResponseErrorHan
resultRequest.setPort(realURL.getPort()); resultRequest.setPort(realURL.getPort());
} }
if (response.getStatusCode().value() > 500) { if (super.apply(response.getStatusCode())) {
resultRequest.setRetStatus(RetStatus.RetFail); resultRequest.setRetStatus(RetStatus.RetFail);
} }
} }

@ -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 <a href="mailto:iskp.me@gmail.com">Elve.Xu</a>
* @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);
}
}
}

@ -20,6 +20,7 @@ package com.tencent.cloud.polaris.circuitbreaker.feign;
import java.io.IOException; import java.io.IOException;
import com.google.common.collect.Maps; 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.core.ConsumerAPI;
import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.rpc.ServiceCallResult;
import feign.Client; import feign.Client;
@ -30,6 +31,7 @@ import feign.Target;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; 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"}) properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"})
public class PolarisFeignClientTest { public class PolarisFeignClientTest {
@Autowired
private PolarisCircuitBreakerProperties properties;
@Test @Test
public void testConstructor() { public void testConstructor() {
try { try {
new PolarisFeignClient(null, null); new PolarisFeignClient(null, null, properties);
fail("NullPointerException should be thrown."); fail("NullPointerException should be thrown.");
} }
catch (Throwable e) { catch (Throwable e) {
@ -64,7 +69,7 @@ public class PolarisFeignClientTest {
} }
try { try {
new PolarisFeignClient(mock(Client.class), null); new PolarisFeignClient(mock(Client.class), null, properties);
fail("NullPointerException should be thrown."); fail("NullPointerException should be thrown.");
} }
catch (Throwable e) { catch (Throwable e) {
@ -73,7 +78,7 @@ public class PolarisFeignClientTest {
} }
try { try {
assertThat(new PolarisFeignClient(mock(Client.class), mock(ConsumerAPI.class))) assertThat(new PolarisFeignClient(mock(Client.class), mock(ConsumerAPI.class), properties))
.isInstanceOf(PolarisFeignClient.class); .isInstanceOf(PolarisFeignClient.class);
} }
catch (Throwable e) { catch (Throwable e) {
@ -107,7 +112,7 @@ public class PolarisFeignClientTest {
RequestTemplate requestTemplate = new RequestTemplate(); RequestTemplate requestTemplate = new RequestTemplate();
requestTemplate.feignTarget(target); requestTemplate.feignTarget(target);
PolarisFeignClient polarisFeignClient = new PolarisFeignClient(delegate, consumerAPI); PolarisFeignClient polarisFeignClient = new PolarisFeignClient(delegate, consumerAPI, properties);
// 200 // 200
Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test", Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test",

@ -22,10 +22,12 @@ import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties;
import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ConsumerAPI;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpMethod; 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"}) properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"})
public class PolarisRestTemplateResponseErrorHandlerTest { public class PolarisRestTemplateResponseErrorHandlerTest {
@Autowired
private PolarisCircuitBreakerProperties properties;
@Test @Test
public void handleError() throws Exception { public void handleError() throws Exception {
ConsumerAPI consumerAPI = mock(ConsumerAPI.class); ConsumerAPI consumerAPI = mock(ConsumerAPI.class);
PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler = new PolarisRestTemplateResponseErrorHandler(consumerAPI, null); PolarisRestTemplateResponseErrorHandler polarisRestTemplateResponseErrorHandler =
new PolarisRestTemplateResponseErrorHandler(properties, consumerAPI, null);
URI uri = mock(URI.class); URI uri = mock(URI.class);
when(uri.getPath()).thenReturn("/test"); when(uri.getPath()).thenReturn("/test");
when(uri.getHost()).thenReturn("host"); when(uri.getHost()).thenReturn("host");

Loading…
Cancel
Save