Browse Source

Updated discovery auto configuration

wip-poc-gh-595-power-of-two-loadbalancer
Tim Ysewyn 6 years ago committed by GitHub
parent
commit
7f5823000f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java
  2. 43
      spring-cloud-commons/src/main/java/org/springframework/cloud/client/ConditionalOnDiscoveryHealthIndicatorEnabled.java
  3. 6
      spring-cloud-commons/src/main/java/org/springframework/cloud/client/ReactiveCommonsClientAutoConfiguration.java
  4. 3
      spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/reactive/ReactiveCompositeDiscoveryClientAutoConfiguration.java
  5. 12
      spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/reactive/SimpleReactiveDiscoveryClientAutoConfiguration.java
  6. 90
      spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java
  7. 70
      spring-cloud-commons/src/test/java/org/springframework/cloud/client/ReactiveCommonsClientAutoConfigurationTests.java

9
spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java

@ -25,7 +25,6 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.condition.Conditi @@ -25,7 +25,6 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.condition.Conditi
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@ -50,21 +49,18 @@ import org.springframework.context.annotation.Configuration; @@ -50,21 +49,18 @@ import org.springframework.context.annotation.Configuration;
* @author Tim Ysewyn
*/
@Configuration
@AutoConfigureOrder(0)
public class CommonsClientAutoConfiguration {
@Configuration
@EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
@ConditionalOnClass(HealthIndicator.class)
@ConditionalOnBean(DiscoveryClient.class)
@ConditionalOnDiscoveryEnabled
@ConditionalOnBlockingDiscoveryEnabled
protected static class DiscoveryLoadBalancerConfiguration {
@Bean
@ConditionalOnProperty(
value = "spring.cloud.discovery.client.health-indicator.enabled",
matchIfMissing = true)
@ConditionalOnClass(HealthIndicator.class)
@ConditionalOnDiscoveryHealthIndicatorEnabled
public DiscoveryClientHealthIndicator discoveryClientHealthIndicator(
ObjectProvider<DiscoveryClient> discoveryClient,
DiscoveryClientHealthIndicatorProperties properties) {
@ -72,6 +68,7 @@ public class CommonsClientAutoConfiguration { @@ -72,6 +68,7 @@ public class CommonsClientAutoConfiguration {
}
@Bean
@ConditionalOnClass(HealthIndicator.class)
@ConditionalOnProperty(
value = "spring.cloud.discovery.client.composite-indicator.enabled",
matchIfMissing = true)

43
spring-cloud-commons/src/main/java/org/springframework/cloud/client/ConditionalOnDiscoveryHealthIndicatorEnabled.java

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
/*
* Copyright 2019-2019 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.client;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
/**
* Provides a more succinct conditional
* <code>spring.cloud.discovery.client.health-indicator.enabled</code>.
*
* @since 2.2.0
* @author Tim Ysewyn
*/
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@ConditionalOnProperty(value = "spring.cloud.discovery.client.health-indicator.enabled",
matchIfMissing = true)
public @interface ConditionalOnDiscoveryHealthIndicatorEnabled {
}

6
spring-cloud-commons/src/main/java/org/springframework/cloud/client/ReactiveCommonsClientAutoConfiguration.java

@ -18,8 +18,7 @@ package org.springframework.cloud.client; @@ -18,8 +18,7 @@ package org.springframework.cloud.client;
import java.util.Collection;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@ -42,18 +41,17 @@ import org.springframework.context.annotation.Configuration; @@ -42,18 +41,17 @@ import org.springframework.context.annotation.Configuration;
* @since 2.2.0
*/
@Configuration
@AutoConfigureOrder(0)
public class ReactiveCommonsClientAutoConfiguration {
@Configuration
@EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
@ConditionalOnClass(HealthIndicator.class)
@ConditionalOnBean(ReactiveDiscoveryClient.class)
@ConditionalOnDiscoveryEnabled
@ConditionalOnReactiveDiscoveryEnabled
protected static class ReactiveDiscoveryLoadBalancerConfiguration {
@Bean
@ConditionalOnClass(ReactiveHealthIndicator.class)
@ConditionalOnProperty(
value = "spring.cloud.discovery.client.composite-indicator.enabled",
matchIfMissing = true)

3
spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/reactive/ReactiveCompositeDiscoveryClientAutoConfiguration.java

@ -18,11 +18,9 @@ package org.springframework.cloud.client.discovery.composite.reactive; @@ -18,11 +18,9 @@ package org.springframework.cloud.client.discovery.composite.reactive;
import java.util.List;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@ -36,7 +34,6 @@ import org.springframework.context.annotation.Primary; @@ -36,7 +34,6 @@ import org.springframework.context.annotation.Primary;
@Configuration
@ConditionalOnDiscoveryEnabled
@ConditionalOnReactiveDiscoveryEnabled
@AutoConfigureBefore(SimpleReactiveDiscoveryClientAutoConfiguration.class)
public class ReactiveCompositeDiscoveryClientAutoConfiguration {
@Bean

12
spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/reactive/SimpleReactiveDiscoveryClientAutoConfiguration.java

@ -20,14 +20,18 @@ import java.net.URI; @@ -20,14 +20,18 @@ import java.net.URI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnDiscoveryHealthIndicatorEnabled;
import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
import org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration;
import org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClientAutoConfiguration;
import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicatorProperties;
import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator;
import org.springframework.cloud.commons.util.InetUtils;
@ -47,6 +51,7 @@ import org.springframework.core.annotation.Order; @@ -47,6 +51,7 @@ import org.springframework.core.annotation.Order;
@ConditionalOnReactiveDiscoveryEnabled
@EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
@AutoConfigureBefore(ReactiveCommonsClientAutoConfiguration.class)
@AutoConfigureAfter(ReactiveCompositeDiscoveryClientAutoConfiguration.class)
public class SimpleReactiveDiscoveryClientAutoConfiguration
implements ApplicationListener<WebServerInitializedEvent> {
@ -78,9 +83,8 @@ public class SimpleReactiveDiscoveryClientAutoConfiguration @@ -78,9 +83,8 @@ public class SimpleReactiveDiscoveryClientAutoConfiguration
}
@Bean
@ConditionalOnProperty(
value = "spring.cloud.discovery.client.health-indicator.enabled",
matchIfMissing = true)
@ConditionalOnClass(ReactiveHealthIndicator.class)
@ConditionalOnDiscoveryHealthIndicatorEnabled
public ReactiveDiscoveryClientHealthIndicator simpleReactiveDiscoveryClientHealthIndicator(
DiscoveryClientHealthIndicatorProperties properties) {
return new ReactiveDiscoveryClientHealthIndicator(simpleReactiveDiscoveryClient(),

90
spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java

@ -18,9 +18,9 @@ package org.springframework.cloud.client; @@ -18,9 +18,9 @@ package org.springframework.cloud.client;
import org.junit.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.client.actuator.FeaturesEndpoint;
@ -29,12 +29,9 @@ import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIn @@ -29,12 +29,9 @@ import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIn
import org.springframework.cloud.client.discovery.health.DiscoveryCompositeHealthIndicator;
import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration;
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.assertj.core.api.BDDAssertions.then;
/**
@ -45,31 +42,35 @@ import static org.assertj.core.api.BDDAssertions.then; @@ -45,31 +42,35 @@ import static org.assertj.core.api.BDDAssertions.then;
public class CommonsClientAutoConfigurationTests {
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
.withConfiguration(
AutoConfigurations.of(HealthEndpointAutoConfiguration.class,
CommonsClientAutoConfiguration.class,
SimpleDiscoveryClientAutoConfiguration.class,
UtilAutoConfiguration.class));
.withConfiguration(AutoConfigurations.of(CommonsClientAutoConfiguration.class,
SimpleDiscoveryClientAutoConfiguration.class,
UtilAutoConfiguration.class));
@Test
public void beansCreatedNormally() {
applicationContextRunner.run(ctxt -> {
then(ctxt.getBean(DiscoveryClientHealthIndicator.class)).isNotNull();
then(ctxt.getBean(DiscoveryCompositeHealthIndicator.class)).isNotNull();
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
then(ctxt.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
});
applicationContextRunner
.withConfiguration(
AutoConfigurations.of(HealthEndpointAutoConfiguration.class))
.run(ctxt -> {
then(ctxt.getBean(DiscoveryClientHealthIndicator.class)).isNotNull();
then(ctxt.getBean(DiscoveryCompositeHealthIndicator.class))
.isNotNull();
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
then(ctxt.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
});
}
@Test
public void disableAll() {
applicationContextRunner
.withPropertyValues("spring.cloud.discovery.enabled=false").run(ctxt -> {
assertBeanNonExistant(ctxt, DiscoveryClientHealthIndicator.class);
assertBeanNonExistant(ctxt, DiscoveryCompositeHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryCompositeHealthIndicator.class);
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
// features actuator is independent of discovery
assertBeanNonExistant(ctxt, HasFeatures.class);
assertThat(ctxt).doesNotHaveBean(HasFeatures.class);
});
}
@ -78,11 +79,13 @@ public class CommonsClientAutoConfigurationTests { @@ -78,11 +79,13 @@ public class CommonsClientAutoConfigurationTests {
applicationContextRunner
.withPropertyValues("spring.cloud.discovery.blocking.enabled=false")
.run(ctxt -> {
assertBeanNonExistant(ctxt, DiscoveryClientHealthIndicator.class);
assertBeanNonExistant(ctxt, DiscoveryCompositeHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryCompositeHealthIndicator.class);
then(ctxt.getBean(FeaturesEndpoint.class)).isNotNull();
// features actuator is independent of discovery
assertBeanNonExistant(ctxt, HasFeatures.class);
assertThat(ctxt).doesNotHaveBean(HasFeatures.class);
});
}
@ -92,9 +95,11 @@ public class CommonsClientAutoConfigurationTests { @@ -92,9 +95,11 @@ public class CommonsClientAutoConfigurationTests {
"spring.cloud.discovery.client.health-indicator.enabled=false",
"spring.cloud.discovery.client.composite-indicator.enabled=false",
"spring.cloud.features.enabled=false").run(ctxt -> {
assertBeanNonExistant(ctxt, DiscoveryClientHealthIndicator.class);
assertBeanNonExistant(ctxt, DiscoveryCompositeHealthIndicator.class);
assertBeanNonExistant(ctxt, FeaturesEndpoint.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryCompositeHealthIndicator.class);
assertThat(ctxt).doesNotHaveBean(FeaturesEndpoint.class);
});
}
@ -104,8 +109,24 @@ public class CommonsClientAutoConfigurationTests { @@ -104,8 +109,24 @@ public class CommonsClientAutoConfigurationTests {
.withPropertyValues(
"spring.cloud.discovery.client.health-indicator.enabled=false")
.run(ctxt -> {
assertBeanNonExistant(ctxt, DiscoveryClientHealthIndicator.class);
assertBeanNonExistant(ctxt, DiscoveryCompositeHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
assertThat(ctxt)
.doesNotHaveBean(DiscoveryCompositeHealthIndicator.class);
});
}
@Test
public void worksWithoutActuator() {
applicationContextRunner
.withClassLoader(
new FilteredClassLoader("org.springframework.boot.actuate"))
.run(context -> {
assertThat(context)
.doesNotHaveBean(DiscoveryClientHealthIndicator.class);
assertThat(context)
.doesNotHaveBean(DiscoveryCompositeHealthIndicator.class);
then(context.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
});
}
@ -113,7 +134,7 @@ public class CommonsClientAutoConfigurationTests { @@ -113,7 +134,7 @@ public class CommonsClientAutoConfigurationTests {
public void conditionalOnDiscoveryEnabledWorks() {
applicationContextRunner.withUserConfiguration(DiscoveryEnabledConfig.class)
.withPropertyValues("spring.cloud.discovery.enabled=false")
.run(context -> assertBeanNonExistant(context, TestBean.class));
.run(context -> assertThat(context).doesNotHaveBean(TestBean.class));
applicationContextRunner.withUserConfiguration(DiscoveryEnabledConfig.class)
.withPropertyValues("spring.cloud.discovery.enabled=true")
.run(context -> assertThat(context.getBean(TestBean.class)).isNotNull());
@ -124,25 +145,14 @@ public class CommonsClientAutoConfigurationTests { @@ -124,25 +145,14 @@ public class CommonsClientAutoConfigurationTests {
applicationContextRunner
.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
.withPropertyValues("spring.cloud.discovery.blocking.enabled=false")
.run(context -> assertBeanNonExistant(context, TestBean.class));
.run(context -> assertThat(context).doesNotHaveBean(TestBean.class));
applicationContextRunner
.withUserConfiguration(BlockingDiscoveryEnabledConfig.class)
.withPropertyValues("spring.cloud.discovery.blocking.enabled=true")
.run(context -> assertThat(context.getBean(TestBean.class)).isNotNull());
}
private void assertBeanNonExistant(ConfigurableApplicationContext ctxt,
Class<?> beanClass) {
try {
ctxt.getBean(beanClass);
fail("Bean of type " + beanClass + " should not have been created");
}
catch (BeansException e) {
// should fail with exception
}
}
@Configuration
@TestConfiguration
@ConditionalOnDiscoveryEnabled
protected static class DiscoveryEnabledConfig {

70
spring-cloud-commons/src/test/java/org/springframework/cloud/client/ReactiveCommonsClientAutoConfigurationTests.java

@ -18,8 +18,8 @@ package org.springframework.cloud.client; @@ -18,8 +18,8 @@ package org.springframework.cloud.client;
import org.junit.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.client.actuator.FeaturesEndpoint;
@ -28,12 +28,9 @@ import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscov @@ -28,12 +28,9 @@ import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscov
import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryCompositeHealthContributor;
import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration;
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.assertj.core.api.BDDAssertions.then;
/**
@ -64,13 +61,13 @@ public class ReactiveCommonsClientAutoConfigurationTests { @@ -64,13 +61,13 @@ public class ReactiveCommonsClientAutoConfigurationTests {
applicationContextRunner
.withPropertyValues("spring.cloud.discovery.enabled=false")
.run(context -> {
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
// features actuator is independent of discovery
then(context.getBean(FeaturesEndpoint.class)).isNotNull();
assertBeanNonExistant(context, HasFeatures.class);
assertThat(context).doesNotHaveBean(HasFeatures.class);
});
}
@ -79,13 +76,13 @@ public class ReactiveCommonsClientAutoConfigurationTests { @@ -79,13 +76,13 @@ public class ReactiveCommonsClientAutoConfigurationTests {
applicationContextRunner
.withPropertyValues("spring.cloud.discovery.reactive.enabled=false")
.run(context -> {
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
// features actuator is independent of discovery
then(context.getBean(FeaturesEndpoint.class)).isNotNull();
assertBeanNonExistant(context, HasFeatures.class);
assertThat(context).doesNotHaveBean(HasFeatures.class);
});
}
@ -95,11 +92,11 @@ public class ReactiveCommonsClientAutoConfigurationTests { @@ -95,11 +92,11 @@ public class ReactiveCommonsClientAutoConfigurationTests {
"spring.cloud.discovery.client.health-indicator.enabled=false",
"spring.cloud.discovery.client.composite-indicator.enabled=false",
"spring.cloud.features.enabled=false").run(context -> {
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
assertBeanNonExistant(context, FeaturesEndpoint.class);
assertThat(context).doesNotHaveBean(FeaturesEndpoint.class);
});
}
@ -109,35 +106,52 @@ public class ReactiveCommonsClientAutoConfigurationTests { @@ -109,35 +106,52 @@ public class ReactiveCommonsClientAutoConfigurationTests {
.withPropertyValues(
"spring.cloud.discovery.client.health-indicator.enabled=false")
.run(context -> {
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertBeanNonExistant(context,
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
});
}
@Test
public void worksWithoutActuator() {
applicationContextRunner
.withClassLoader(
new FilteredClassLoader("org.springframework.boot.actuate"))
.run(context -> {
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
then(context.getBeansOfType(HasFeatures.class).values()).isNotEmpty();
});
}
@Test
public void worksWithoutWebflux() {
applicationContextRunner
.withClassLoader(
new FilteredClassLoader("org.springframework.web.reactive"))
.run(context -> {
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).doesNotHaveBean(
ReactiveDiscoveryCompositeHealthContributor.class);
assertThat(context).doesNotHaveBean(HasFeatures.class);
});
}
@Test
public void conditionalOnReactiveDiscoveryEnabledWorks() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withUserConfiguration(ReactiveDiscoveryEnabledConfig.class);
contextRunner.withPropertyValues("spring.cloud.discovery.reactive.enabled=false")
.run(context -> assertBeanNonExistant(context, TestBean.class));
.run(context -> assertThat(context).doesNotHaveBean(TestBean.class));
contextRunner.withPropertyValues("spring.cloud.discovery.reactive.enabled=true")
.run(context -> assertThat(context.getBean(TestBean.class)).isNotNull());
}
private void assertBeanNonExistant(ConfigurableApplicationContext ctxt,
Class<?> beanClass) {
try {
ctxt.getBean(beanClass);
fail("Bean of type " + beanClass + " should not have been created");
}
catch (BeansException e) {
// should fail with exception
}
}
@Configuration
@TestConfiguration
@ConditionalOnDiscoveryEnabled
protected static class DiscoveryEnabledConfig {

Loading…
Cancel
Save