diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java deleted file mode 100644 index 3b204d5..0000000 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.microsphere.spring.cloud.openfeign; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.cloud.context.named.NamedContextFactory; -import org.springframework.cloud.openfeign.FeignClientSpecification; - -/** - * @author 韩超 - * @since 0.0.1 - */ -public class FeignComponentProvider implements BeanFactoryAware { - - private final NamedContextFactory contextFactory; - - private BeanFactory mainBeanFactory; - - public FeignComponentProvider(NamedContextFactory contextFactory) { - this.contextFactory = contextFactory; - } - - public T getInstance(String contextName, Class type) { - T component = this.contextFactory.getInstance(contextName, type); - if (component == null && mainBeanFactory instanceof AutowireCapableBeanFactory) { - //create new - return ((AutowireCapableBeanFactory)this.mainBeanFactory).createBean(type); - } - return component; - } - - @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { - this.mainBeanFactory = beanFactory; - } -} diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java index bc01cd1..6eacb45 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java @@ -1,6 +1,5 @@ package io.microsphere.spring.cloud.openfeign.autoconfigure; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; import io.microsphere.spring.cloud.openfeign.autorefresh.FeignClientConfigurationChangedListener; import io.microsphere.spring.cloud.openfeign.autorefresh.FeignComponentRegistry; import io.microsphere.spring.cloud.openfeign.components.NoOpRequestInterceptor; @@ -10,7 +9,6 @@ import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignBuilderCustomizer; import org.springframework.cloud.openfeign.FeignClientProperties; -import org.springframework.cloud.openfeign.FeignClientSpecification; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.event.EventListener; @@ -51,11 +49,6 @@ public FeignClientSpecificationPostProcessor feignClientSpecificationPostProcess return new FeignClientSpecificationPostProcessor(); } - @Bean - public FeignComponentProvider feignComponentProvider(NamedContextFactory contextFactory) { - return new FeignComponentProvider(contextFactory); - } - private void registerFeignClientConfigurationChangedListener(ApplicationReadyEvent event) { ConfigurableApplicationContext context = event.getApplicationContext(); FeignComponentRegistry feignComponentRegistry = context.getBean(FeignComponentRegistry.class); diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java index 884c00a..9fe6808 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java @@ -1,23 +1,14 @@ package io.microsphere.spring.cloud.openfeign.autorefresh; -import feign.Capability; -import feign.Contract; -import feign.QueryMapEncoder; -import feign.RequestInterceptor; -import feign.Retryer; +import feign.*; import feign.codec.Decoder; import feign.codec.Encoder; import feign.codec.ErrorDecoder; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; -import io.microsphere.spring.cloud.openfeign.components.DecoratedContract; -import io.microsphere.spring.cloud.openfeign.components.DecoratedDecoder; -import io.microsphere.spring.cloud.openfeign.components.DecoratedEncoder; -import io.microsphere.spring.cloud.openfeign.components.DecoratedErrorDecoder; -import io.microsphere.spring.cloud.openfeign.components.DecoratedFeignComponent; -import io.microsphere.spring.cloud.openfeign.components.DecoratedQueryMapEncoder; -import io.microsphere.spring.cloud.openfeign.components.DecoratedRetryer; +import io.microsphere.spring.cloud.openfeign.components.*; import org.springframework.beans.BeansException; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -29,15 +20,15 @@ public class AutoRefreshCapability implements Capability, ApplicationContextAwar private final FeignComponentRegistry componentRegistry; //private final FeignClientFactory feignClientFactory; - private final FeignComponentProvider componentProvider; + private final NamedContextFactory contextFactory; private final FeignClientProperties clientProperties; private String contextId; - public AutoRefreshCapability(FeignClientProperties clientProperties, FeignComponentProvider componentProvider, FeignComponentRegistry componentRegistry) { + public AutoRefreshCapability(FeignClientProperties clientProperties, NamedContextFactory contextFactory, FeignComponentRegistry componentRegistry) { this.clientProperties = clientProperties; - this.componentProvider = componentProvider; + this.contextFactory = contextFactory; this.componentRegistry = componentRegistry; } @@ -53,7 +44,7 @@ public Retryer enrich(Retryer retryer) { return null; DecoratedRetryer decoratedRetryer = DecoratedFeignComponent.instantiate(DecoratedRetryer.class, Retryer.class, - contextId, componentProvider, clientProperties, retryer); + contextId, contextFactory, clientProperties, retryer); this.componentRegistry.register(contextId, decoratedRetryer); return decoratedRetryer; @@ -65,7 +56,7 @@ public Contract enrich(Contract contract) { return null; DecoratedContract decoratedContract = DecoratedFeignComponent.instantiate(DecoratedContract.class, Contract.class, - contextId, componentProvider, clientProperties, contract); + contextId, contextFactory, clientProperties, contract); this.componentRegistry.register(contextId, decoratedContract); return decoratedContract; } @@ -76,7 +67,7 @@ public Decoder enrich(Decoder decoder) { return null; DecoratedDecoder decoratedDecoder = DecoratedFeignComponent.instantiate(DecoratedDecoder.class, Decoder.class, - contextId, componentProvider, clientProperties, decoder); + contextId, contextFactory, clientProperties, decoder); this.componentRegistry.register(contextId, decoratedDecoder); return decoratedDecoder; } @@ -87,7 +78,7 @@ public Encoder enrich(Encoder encoder) { return null; DecoratedEncoder decoratedEncoder = DecoratedFeignComponent.instantiate(DecoratedEncoder.class, Encoder.class, - contextId, componentProvider, clientProperties, encoder); + contextId, contextFactory, clientProperties, encoder); this.componentRegistry.register(contextId, decoratedEncoder); return decoratedEncoder; } @@ -97,7 +88,7 @@ public ErrorDecoder enrich(ErrorDecoder decoder) { return null; DecoratedErrorDecoder decoratedErrorDecoder = DecoratedFeignComponent.instantiate(DecoratedErrorDecoder.class, ErrorDecoder.class, - contextId, componentProvider, clientProperties, decoder); + contextId, contextFactory, clientProperties, decoder); this.componentRegistry.register(contextId, decoratedErrorDecoder); return decoratedErrorDecoder; } @@ -113,7 +104,7 @@ public QueryMapEncoder enrich(QueryMapEncoder queryMapEncoder) { return null; DecoratedQueryMapEncoder decoratedQueryMapEncoder = DecoratedFeignComponent.instantiate(DecoratedQueryMapEncoder.class, QueryMapEncoder.class, - contextId, componentProvider, clientProperties, queryMapEncoder); + contextId, contextFactory, clientProperties, queryMapEncoder); this.componentRegistry.register(contextId, decoratedQueryMapEncoder); return decoratedQueryMapEncoder; diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java index 4cb3cf9..d7237a9 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java @@ -7,11 +7,7 @@ import org.springframework.cloud.openfeign.FeignClientProperties; import org.springframework.util.CollectionUtils; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author 韩超 @@ -29,6 +25,10 @@ public CompositedRequestInterceptor(String contextId, BeanFactory beanFactory) { this.contextId = contextId; } + public Set getRequestInterceptors() { + return Collections.unmodifiableSet(set); + } + @Override public void apply(RequestTemplate template) { diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java index 05eee3d..025ef5f 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java @@ -2,8 +2,9 @@ import feign.Contract; import feign.MethodMetadata; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import java.util.List; @@ -13,8 +14,8 @@ */ public class DecoratedContract extends DecoratedFeignComponent implements Contract { - public DecoratedContract(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Contract delegate) { - super(contextId, feignComponentProvider, clientProperties, delegate); + public DecoratedContract(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Contract delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java index 91da63d..afcb0ae 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java @@ -4,8 +4,9 @@ import feign.Response; import feign.codec.DecodeException; import feign.codec.Decoder; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import java.io.IOException; import java.lang.reflect.Type; @@ -16,8 +17,8 @@ */ public class DecoratedDecoder extends DecoratedFeignComponent implements Decoder { - public DecoratedDecoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Decoder delegate) { - super(contextId, feignComponentProvider, clientProperties, delegate); + public DecoratedDecoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Decoder delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java index 3ef7a3b..951e6ca 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java @@ -3,8 +3,9 @@ import feign.RequestTemplate; import feign.codec.EncodeException; import feign.codec.Encoder; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import java.lang.reflect.Type; @@ -14,8 +15,8 @@ */ public class DecoratedEncoder extends DecoratedFeignComponent implements Encoder { - public DecoratedEncoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Encoder delegate) { - super(contextId, feignComponentProvider, clientProperties, delegate); + public DecoratedEncoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Encoder delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java index 9876660..c9c97d7 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java @@ -2,8 +2,9 @@ import feign.Response; import feign.codec.ErrorDecoder; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; /** * @author 韩超 @@ -11,8 +12,8 @@ */ public class DecoratedErrorDecoder extends DecoratedFeignComponent implements ErrorDecoder { - public DecoratedErrorDecoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, ErrorDecoder delegate) { - super(contextId, feignComponentProvider, clientProperties, delegate); + public DecoratedErrorDecoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, ErrorDecoder delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java index aeb65b6..0995f2c 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java @@ -1,11 +1,12 @@ package io.microsphere.spring.cloud.openfeign.components; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.BeanUtils; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import org.springframework.lang.NonNull; import java.lang.reflect.Constructor; @@ -20,7 +21,7 @@ public abstract class DecoratedFeignComponent implements Refreshable { private final Logger log = LoggerFactory.getLogger(getClass()); //private final FeignClientFactory feignClientFactory; - private final FeignComponentProvider componentProvider; + private final NamedContextFactory contextFactory; private final String contextId; private final FeignClientProperties clientProperties; @@ -33,9 +34,9 @@ public abstract class DecoratedFeignComponent implements Refreshable { private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock(); private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); - public DecoratedFeignComponent(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, T delegate) { + public DecoratedFeignComponent(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, T delegate) { this.contextId = contextId; - this.componentProvider = feignComponentProvider; + this.contextFactory = contextFactory; this.clientProperties = clientProperties; this.delegate = delegate; } @@ -53,9 +54,12 @@ public T delegate() { } @NonNull - public FeignComponentProvider getFeignComponentProvider() { - return this.componentProvider; - }; + public T loadInstanceFromContextFactory(String contextId, Class componentType) { + T component = this.contextFactory.getInstance(contextId, componentType); + if (component == null) + return this.contextFactory.getParent().getAutowireCapableBeanFactory().createBean(componentType); + return component; + } @NonNull public String contextId() { @@ -84,9 +88,7 @@ protected T loadInstance() { String contextId = contextId(); writeLock.lock(); try { - T component = getFeignComponentProvider().getInstance(contextId, componentType); - if (component == null) - component = BeanUtils.instantiateClass(componentType); + T component = loadInstanceFromContextFactory(contextId, componentType); this.delegate = component; return component; } catch (Throwable ex) { @@ -113,10 +115,10 @@ public String toString() { } public static , T> W instantiate(Class decoratedClass, Class componentClass, - String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, T delegate) { + String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, T delegate) { try { - Constructor constructor = decoratedClass.getConstructor(String.class, FeignComponentProvider.class, FeignClientProperties.class, componentClass); - return BeanUtils.instantiateClass(constructor, contextId, feignComponentProvider, clientProperties, delegate); + Constructor constructor = decoratedClass.getConstructor(String.class, NamedContextFactory.class, FeignClientProperties.class, componentClass); + return BeanUtils.instantiateClass(constructor, contextId, contextFactory, clientProperties, delegate); } catch (NoSuchMethodException noSuchMethodException) { throw new BeanInstantiationException(decoratedClass, noSuchMethodException.getLocalizedMessage()); } diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java index 6e4d941..c40c140 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java @@ -2,8 +2,9 @@ import feign.QueryMapEncoder; import io.microsphere.logging.Logger; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; import java.lang.invoke.MethodHandle; import java.util.Map; @@ -23,8 +24,8 @@ public class DecoratedQueryMapEncoder extends DecoratedFeignComponent contextFactory, FeignClientProperties clientProperties, QueryMapEncoder delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java index 1e5dd59..3d1cb2c 100644 --- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java +++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java @@ -2,8 +2,9 @@ import feign.RetryableException; import feign.Retryer; -import io.microsphere.spring.cloud.openfeign.FeignComponentProvider; +import org.springframework.cloud.context.named.NamedContextFactory; import org.springframework.cloud.openfeign.FeignClientProperties; +import org.springframework.cloud.openfeign.FeignClientSpecification; /** * @author 韩超 @@ -11,8 +12,8 @@ */ public class DecoratedRetryer extends DecoratedFeignComponent implements Retryer { - public DecoratedRetryer(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Retryer delegate) { - super(contextId, feignComponentProvider, clientProperties, delegate); + public DecoratedRetryer(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Retryer delegate) { + super(contextId, contextFactory, clientProperties, delegate); } @Override diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java index 3a4edcf..47de7f4 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java @@ -9,7 +9,7 @@ * @author 韩超 * @since 0.0.1 */ -@FeignClient(contextId = "my-client", name = "my-client") +@FeignClient(contextId = "my-client", name = "my-client", configuration = {MockCapability.class}) public interface BaseClient { @GetMapping("echo") diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java index c21b1f6..6f7a3d7 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java @@ -1,6 +1,8 @@ package io.microsphere.spring.cloud.openfeign; import io.microsphere.spring.cloud.openfeign.autoconfigure.EnableFeignAutoRefresh; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +30,10 @@ @TestPropertySource(properties = { "spring.main.allow-bean-definition-overriding=true", "spring.cloud.openfeign.client.config.default.encoder=io.microsphere.spring.cloud.openfeign.encoder.AEncoder", + "spring.cloud.openfeign.client.config.default.error-decoder=io.microsphere.spring.cloud.openfeign.errordecoder.AErrorDecoder", + "spring.cloud.openfeign.client.config.default.query-map-encoder=io.microsphere.spring.cloud.openfeign.querymapencoder.AQueryMapEncoder", + "spring.cloud.openfeign.client.config.default.retryer=io.microsphere.spring.cloud.openfeign.retryer.ARetry", + "spring.cloud.openfeign.client.config.default.decoder=io.microsphere.spring.cloud.openfeign.decoder.ADecoder", "spring.cloud.openfeign.client.config.default.request-interceptors[0]=io.microsphere.spring.cloud.openfeign.requestInterceptor.ARequestInterceptor", "spring.cloud.openfeign.client.config.default.default-request-headers.app=my-app", "spring.cloud.openfeign.client.config.default.default-query-parameters.sign=my-sign", @@ -46,7 +52,9 @@ public abstract class BaseTest { private BaseClient client; protected abstract String afterTestComponentConfigKey(); + protected abstract Class beforeTestComponentClass(); protected abstract Class afterTestComponent(); + protected abstract FeignComponentAssert loadFeignComponentAssert(); public void replaceConfig() { final String key = afterTestComponentConfigKey(); @@ -67,19 +75,21 @@ public void replaceConfig() { @Test public void testInternal() { + ObservableFeignInvocationHandler.componentAssert = loadFeignComponentAssert(); + + ObservableFeignInvocationHandler.expectComponentClass = beforeTestComponentClass(); try { this.client.echo("hello", "1.0"); } catch (Exception ignored) { - } replaceConfig(); + + ObservableFeignInvocationHandler.expectComponentClass = afterTestComponent(); try { this.client.echo("world", "1.0"); } catch (Exception ignored) { } - - } protected void triggerRefreshEvent() { diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java new file mode 100644 index 0000000..57f56d8 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java @@ -0,0 +1,19 @@ +package io.microsphere.spring.cloud.openfeign; + +import feign.ResponseHandler; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public abstract class FeignComponentAssert { + + + protected abstract T loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception; + + public boolean expect(Object configuration, ResponseHandler responseHandler, Class expectedClass) throws Exception { + T component = loadCurrentComponent(configuration, responseHandler); + return expectedClass.equals(component.getClass()); + } + +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java new file mode 100644 index 0000000..53562b7 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java @@ -0,0 +1,18 @@ +package io.microsphere.spring.cloud.openfeign; + +import feign.Capability; +import feign.InvocationHandlerFactory; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class MockCapability implements Capability { + + @Override + public InvocationHandlerFactory enrich(InvocationHandlerFactory invocationHandlerFactory) { + return ObservableFeignInvocationHandler::new; + } + + +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java new file mode 100644 index 0000000..b23280b --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java @@ -0,0 +1,101 @@ +package io.microsphere.spring.cloud.openfeign; + +import feign.InvocationHandlerFactory; +import feign.ResponseHandler; +import feign.Target; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; + +import static feign.Util.checkNotNull; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class ObservableFeignInvocationHandler implements InvocationHandler { + + + private static final Logger log = LoggerFactory.getLogger(ObservableFeignInvocationHandler.class); + public static FeignComponentAssert componentAssert; + public static Class expectComponentClass; + + private final Target target; + private final Map dispatch; + + ObservableFeignInvocationHandler(Target target, Map dispatch) { + this.target = checkNotNull(target, "target"); + this.dispatch = checkNotNull(dispatch, "dispatch for %s", target); + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if ("equals".equals(method.getName())) { + try { + Object otherHandler = + args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null; + return equals(otherHandler); + } catch (IllegalArgumentException e) { + return false; + } + } else if ("hashCode".equals(method.getName())) { + return hashCode(); + } else if ("toString".equals(method.getName())) { + return toString(); + } else if (!dispatch.containsKey(method)) { + throw new UnsupportedOperationException( + String.format("Method \"%s\" should not be called", method.getName())); + } + + InvocationHandlerFactory.MethodHandler methodHandler = dispatch.get(method); + Object methodHandlerConfiguration = loadMethodHandlerConfiguration(methodHandler); + ResponseHandler responseHandler = loadResponseHandler(methodHandler); + Assert.isTrue(componentAssert.expect(methodHandlerConfiguration, responseHandler, expectComponentClass), "unexpected component"); + log.info("component validation is True"); + return dispatch.get(method).invoke(args); + } + + protected Object loadMethodHandlerConfiguration(InvocationHandlerFactory.MethodHandler methodHandler) throws Exception { + if (ClassUtils.isPresent("feign.MethodHandlerConfiguration", ObservableFeignInvocationHandler.class.getClassLoader())) { + Class configurationType = methodHandler.getClass(); + Field field = configurationType.getDeclaredField("methodHandlerConfiguration"); + field.setAccessible(true); + return field.get(methodHandler); + } + return methodHandler; + + } + + protected ResponseHandler loadResponseHandler(InvocationHandlerFactory.MethodHandler methodHandler) throws Exception { + Class configurationType = methodHandler.getClass(); + Field field = configurationType.getDeclaredField("responseHandler"); + field.setAccessible(true); + return (ResponseHandler) field.get(methodHandler); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ObservableFeignInvocationHandler) { + ObservableFeignInvocationHandler other = (ObservableFeignInvocationHandler) obj; + return target.equals(other.target); + } + return false; + } + + @Override + public int hashCode() { + return target.hashCode(); + } + + @Override + public String toString() { + return target.toString(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java new file mode 100644 index 0000000..14b8535 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java @@ -0,0 +1,21 @@ +package io.microsphere.spring.cloud.openfeign.decoder; + +import feign.FeignException; +import feign.Response; +import feign.codec.DecodeException; +import feign.codec.Decoder; + +import java.io.IOException; +import java.lang.reflect.Type; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class ADecoder implements Decoder { + + @Override + public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException { + return null; + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java new file mode 100644 index 0000000..7762fe7 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java @@ -0,0 +1,21 @@ +package io.microsphere.spring.cloud.openfeign.decoder; + +import feign.FeignException; +import feign.Response; +import feign.codec.DecodeException; +import feign.codec.Decoder; + +import java.io.IOException; +import java.lang.reflect.Type; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class BDecoder implements Decoder { + + @Override + public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException { + return null; + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java new file mode 100644 index 0000000..bbbb810 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java @@ -0,0 +1,36 @@ +package io.microsphere.spring.cloud.openfeign.decoder; + +import feign.codec.Decoder; +import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @author 韩超 + * @since 0.0.1 + */ +@SpringBootTest(classes = DecoderChangedTest.class) +@EnableAutoConfiguration +public class DecoderChangedTest extends BaseTest { + + @Override + protected String afterTestComponentConfigKey() { + return "spring.cloud.openfeign.client.config.my-client.decoder"; + } + + @Override + protected Class beforeTestComponentClass() { + return ADecoder.class; + } + + @Override + protected Class afterTestComponent() { + return BDecoder.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return new DecoderComponentAssert(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java new file mode 100644 index 0000000..c43b0c4 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java @@ -0,0 +1,24 @@ +package io.microsphere.spring.cloud.openfeign.decoder; + +import feign.ResponseHandler; +import feign.codec.Decoder; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.DecoratedDecoder; + +import java.lang.reflect.Field; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class DecoderComponentAssert extends FeignComponentAssert { + + @Override + protected Decoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class responseHandlerClass = ResponseHandler.class; + Field decoderField = responseHandlerClass.getDeclaredField("decoder"); + decoderField.setAccessible(true); + DecoratedDecoder decoder = (DecoratedDecoder)decoderField.get(responseHandler); + return decoder.delegate(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java index a9883ba..23abbb8 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java @@ -14,7 +14,6 @@ public class AEncoder implements Encoder { @Override public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { - System.out.println("AEncoder is working..."); template.body(object.toString()); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java index 302c04e..1d3300d 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java @@ -14,7 +14,6 @@ public class BEncoder implements Encoder { @Override public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { - System.out.println("BEncoder is working..."); template.body(object.toString()); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java index 7989641..1229021 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java @@ -2,6 +2,7 @@ import feign.codec.Encoder; import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -13,6 +14,17 @@ @EnableAutoConfiguration public class EncoderChangedTest extends BaseTest { + + @Override + protected Class beforeTestComponentClass() { + return AEncoder.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return EncoderComponentAssert.INSTANCE; + } + @Override protected String afterTestComponentConfigKey() { return "spring.cloud.openfeign.client.config.my-client.encoder"; diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java new file mode 100644 index 0000000..b79c0d3 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java @@ -0,0 +1,34 @@ +package io.microsphere.spring.cloud.openfeign.encoder; + +import feign.ResponseHandler; +import feign.codec.Encoder; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.DecoratedEncoder; + +import java.lang.reflect.Field; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class EncoderComponentAssert extends FeignComponentAssert { + + public static final EncoderComponentAssert INSTANCE = new EncoderComponentAssert(); + + private EncoderComponentAssert() { + + } + + @Override + protected Encoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class configurationClass = configuration.getClass(); + Field buildTemplateFromArgs = configurationClass.getDeclaredField("buildTemplateFromArgs"); + buildTemplateFromArgs.setAccessible(true); + Object buildTemplateFromArgsValue = buildTemplateFromArgs.get(configuration); + Class buildTemplateFromArgsType = buildTemplateFromArgsValue.getClass(); + Field encoderField = buildTemplateFromArgsType.getDeclaredField("encoder"); + encoderField.setAccessible(true); + DecoratedEncoder encoder = (DecoratedEncoder)encoderField.get(buildTemplateFromArgsValue); + return encoder.delegate(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java index 7fb72d9..b9a9d2a 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java @@ -15,7 +15,6 @@ public class AErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { - log.trace("Error decoding {}", methodKey); return new IllegalArgumentException(""); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java new file mode 100644 index 0000000..4c7bac0 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java @@ -0,0 +1,16 @@ +package io.microsphere.spring.cloud.openfeign.errordecoder; + +import feign.Response; +import feign.codec.ErrorDecoder; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class BErrorEncoder implements ErrorDecoder { + + @Override + public Exception decode(String methodKey, Response response) { + return null; + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java index 79a2e1b..c014079 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java @@ -2,6 +2,7 @@ import feign.codec.ErrorDecoder; import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -13,6 +14,16 @@ @EnableAutoConfiguration public class ErrorDecoderChangedTest extends BaseTest { + @Override + protected Class beforeTestComponentClass() { + return AErrorDecoder.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return new ErrorDecoderComponentAssert(); + } + @Override protected String afterTestComponentConfigKey() { return "spring.cloud.openfeign.client.config.my-client.error-decoder"; @@ -20,6 +31,6 @@ protected String afterTestComponentConfigKey() { @Override protected Class afterTestComponent() { - return AErrorDecoder.class; + return BErrorEncoder.class; } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java new file mode 100644 index 0000000..1089259 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java @@ -0,0 +1,24 @@ +package io.microsphere.spring.cloud.openfeign.errordecoder; + +import feign.ResponseHandler; +import feign.codec.ErrorDecoder; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.DecoratedErrorDecoder; + +import java.lang.reflect.Field; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class ErrorDecoderComponentAssert extends FeignComponentAssert { + + @Override + protected ErrorDecoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class responseHandlerClass = ResponseHandler.class; + Field errorDecoderField = responseHandlerClass.getDeclaredField("errorDecoder"); + errorDecoderField.setAccessible(true); + DecoratedErrorDecoder errorDecoder = (DecoratedErrorDecoder)errorDecoderField.get(responseHandler); + return errorDecoder.delegate(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java index 4cde8f0..79e20f1 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java @@ -18,7 +18,6 @@ public class AQueryMapEncoder implements QueryMapEncoder { @Override public Map encode(Object object) { - log.trace("AQueryMapEncoder.encode({})", object); return new HashMap<>(); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java index 0803269..7d271d4 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java @@ -18,7 +18,6 @@ public class BQueryMapEncoder implements QueryMapEncoder { @Override public Map encode(Object object) { - log.trace("AQueryMapEncoder.encode({})", object); return new HashMap<>(); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java index 14f9ba8..1afa7df 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java @@ -2,6 +2,7 @@ import feign.QueryMapEncoder; import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -13,6 +14,16 @@ @EnableAutoConfiguration public class QueryMapEncoderChangedTest extends BaseTest { + @Override + protected Class beforeTestComponentClass() { + return AQueryMapEncoder.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return new QueryMapEncoderComponentAssert(); + } + @Override protected String afterTestComponentConfigKey() { return "spring.cloud.openfeign.client.config.my-client.query-map-encoder"; diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java new file mode 100644 index 0000000..9eeb180 --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java @@ -0,0 +1,28 @@ +package io.microsphere.spring.cloud.openfeign.querymapencoder; + +import feign.QueryMapEncoder; +import feign.ResponseHandler; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.DecoratedQueryMapEncoder; + +import java.lang.reflect.Field; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class QueryMapEncoderComponentAssert extends FeignComponentAssert { + + @Override + protected QueryMapEncoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class configurationClass = configuration.getClass(); + Field buildTemplateFromArgs = configurationClass.getDeclaredField("buildTemplateFromArgs"); + buildTemplateFromArgs.setAccessible(true); + Object buildTemplateFromArgsValue = buildTemplateFromArgs.get(configuration); + Class buildTemplateFromArgsType = buildTemplateFromArgsValue.getClass().getSuperclass(); + Field encoderField = buildTemplateFromArgsType.getDeclaredField("queryMapEncoder"); + encoderField.setAccessible(true); + DecoratedQueryMapEncoder encoder = (DecoratedQueryMapEncoder)encoderField.get(buildTemplateFromArgsValue); + return encoder.delegate(); + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java index 84ffa4d..d7e8fc0 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java @@ -11,6 +11,5 @@ public class ARequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { - System.out.println(getClass() + ": A is working..."); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java index 108f58c..b06dd60 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java @@ -11,6 +11,5 @@ public class BRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { - System.out.println(getClass() + "B is working..."); } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java index f9651f1..b290206 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java @@ -2,6 +2,7 @@ import feign.RequestInterceptor; import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -13,6 +14,16 @@ @EnableAutoConfiguration public class RequestInterceptorChangedTest extends BaseTest { + @Override + protected Class beforeTestComponentClass() { + return ARequestInterceptor.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return new RequestInterceptorComponentAssert(); + } + @Override protected String afterTestComponentConfigKey() { return "spring.cloud.openfeign.client.config.my-client.request-interceptors[0]"; diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java new file mode 100644 index 0000000..c3eb60a --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java @@ -0,0 +1,40 @@ +package io.microsphere.spring.cloud.openfeign.requestInterceptor; + +import feign.RequestInterceptor; +import feign.ResponseHandler; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.CompositedRequestInterceptor; + +import java.lang.reflect.Field; +import java.util.List; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class RequestInterceptorComponentAssert extends FeignComponentAssert { + + @Override + protected CompositedRequestInterceptor loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class configurationClass = configuration.getClass(); + Field retryField = configurationClass.getDeclaredField("requestInterceptors"); + retryField.setAccessible(true); + List retryer = (List) retryField.get(configuration); + for (RequestInterceptor interceptor : retryer) { + if (interceptor instanceof CompositedRequestInterceptor) { + return (CompositedRequestInterceptor) interceptor; + } + } + return null; + } + + @Override + public boolean expect(Object configuration, ResponseHandler responseHandler, Class expectedClass) throws Exception { + CompositedRequestInterceptor requestInterceptor = loadCurrentComponent(configuration, responseHandler); + for(RequestInterceptor interceptor : requestInterceptor.getRequestInterceptors()) { + if (expectedClass.equals(interceptor.getClass())) + return true; + } + return false; + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java new file mode 100644 index 0000000..b8ac51c --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java @@ -0,0 +1,21 @@ +package io.microsphere.spring.cloud.openfeign.retryer; + +import feign.RetryableException; +import feign.Retryer; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class BRetry implements Retryer { + + @Override + public void continueOrPropagate(RetryableException e) { + + } + + @Override + public Retryer clone() { + return this; + } +} diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java index 5139dfc..1ac2c78 100644 --- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java @@ -2,6 +2,7 @@ import feign.Retryer; import io.microsphere.spring.cloud.openfeign.BaseTest; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -13,6 +14,16 @@ @EnableAutoConfiguration public class RetryerChangedTest extends BaseTest { + @Override + protected Class beforeTestComponentClass() { + return ARetry.class; + } + + @Override + protected FeignComponentAssert loadFeignComponentAssert() { + return new RetryerComponentAssert(); + } + @Override protected String afterTestComponentConfigKey() { return "spring.cloud.openfeign.client.config.my-client.retryer"; @@ -20,6 +31,6 @@ protected String afterTestComponentConfigKey() { @Override protected Class afterTestComponent() { - return ARetry.class; + return BRetry.class; } } diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java new file mode 100644 index 0000000..19dc78c --- /dev/null +++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java @@ -0,0 +1,24 @@ +package io.microsphere.spring.cloud.openfeign.retryer; + +import feign.ResponseHandler; +import feign.Retryer; +import io.microsphere.spring.cloud.openfeign.FeignComponentAssert; +import io.microsphere.spring.cloud.openfeign.components.DecoratedRetryer; + +import java.lang.reflect.Field; + +/** + * @author 韩超 + * @since 0.0.1 + */ +public class RetryerComponentAssert extends FeignComponentAssert { + + @Override + protected Retryer loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception { + Class configurationClass = configuration.getClass(); + Field retryField = configurationClass.getDeclaredField("retryer"); + retryField.setAccessible(true); + DecoratedRetryer retryer = (DecoratedRetryer) retryField.get(configuration); + return retryer.delegate(); + } +}