diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index a670fd7e..2c603d02 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -72,6 +72,7 @@ import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResour * @author Julien Roy * @author Grzegorz Poznachowski * @author Nikita Konev + * @author Tim Peeters */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Feign.class) @@ -129,7 +130,7 @@ public class FeignAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(CircuitBreaker.class) - @ConditionalOnProperty("feign.circuitbreaker.enabled") + @ConditionalOnProperty(value = "feign.circuitbreaker.enabled", havingValue = "true") protected static class CircuitBreakerPresentFeignTargeterConfiguration { @Bean @@ -149,7 +150,7 @@ public class FeignAutoConfiguration { // the following configuration is for alternate feign clients if // SC loadbalancer is not on the class path. - // see corresponding configurations in FeignRibbonClientAutoConfiguration + // see corresponding configurations in FeignLoadBalancerAutoConfiguration // for load-balanced clients. @Configuration(proxyBeanMethods = false) @ConditionalOnClass(ApacheHttpClient.class) diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java new file mode 100644 index 00000000..72e450b6 --- /dev/null +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * 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 org.springframework.cloud.openfeign; + +import org.assertj.core.api.Condition; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.context.ConfigurableApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +/** + * @author Tim Peeters + * @author Olga Maciaszek-Sharma + */ +class FeignAutoConfigurationTests { + + private final ApplicationContextRunner runner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(FeignAutoConfiguration.class)) + .withPropertyValues("feign.httpclient.enabled=false"); + + @Test + void shouldInstantiateDefaultTargeterWhenFeignCircuitBreakerIsDisabled() { + runner.withPropertyValues("feign.circuitbreaker.enabled=false") + .run(ctx -> assertOnlyOneTargeterPresent(ctx, DefaultTargeter.class)); + } + + @Test + void shouldInstantiateFeignCircuitBreakerTargeterWhenEnabled() { + runner.withBean(CircuitBreakerFactory.class, () -> mock(CircuitBreakerFactory.class)) + .withPropertyValues("feign.circuitbreaker.enabled=true") + .run(ctx -> assertOnlyOneTargeterPresent(ctx, FeignCircuitBreakerTargeter.class)); + } + + private void assertOnlyOneTargeterPresent(ConfigurableApplicationContext ctx, Class beanClass) { + assertThat(ctx.getBeansOfType(Targeter.class)).hasSize(1).hasValueSatisfying(new Condition<>( + beanClass::isInstance, String.format("Targeter should be an instance of %s", beanClass))); + } + +}