Back to Repositories

Testing Nacos Discovery Load Balancer Configuration in Spring Cloud Alibaba

This test suite validates the Nacos Discovery load balancer configuration in Spring Cloud Alibaba, focusing on the automatic configuration and conditional enablement of Nacos load balancing features.

Test Coverage Overview

The test suite provides comprehensive coverage of Nacos load balancer configuration scenarios.

  • Verifies load balancer enablement through property configuration
  • Tests bean creation and availability in both enabled and disabled states
  • Validates auto-configuration chains and dependencies

Implementation Analysis

The testing approach utilizes Spring Boot’s ApplicationContextRunner for configuration testing.

Implements systematic verification of auto-configuration behavior using property-driven test cases. The tests employ Spring’s context configuration validation patterns to ensure proper bean management and conditional configuration.

Technical Details

  • JUnit Jupiter test framework
  • Spring Boot test context runner
  • AssertJ assertions for validation
  • Auto-configuration test utilities
  • Property-based configuration testing

Best Practices Demonstrated

The test suite exemplifies high-quality testing practices in Spring Cloud microservices.

  • Isolated context testing
  • Clear separation of configuration scenarios
  • Comprehensive bean presence validation
  • Proper use of Spring Boot test utilities
  • Clean and maintainable test structure

alibaba/spring-cloud-alibaba

spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryLoadBalancerConfigurationTest.java

            
/*
 * Copyright 2013-2023 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 com.alibaba.cloud.nacos.discovery;

import com.alibaba.cloud.nacos.NacosServiceAutoConfiguration;
import com.alibaba.cloud.nacos.loadbalancer.LoadBalancerAlgorithm;
import com.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfiguration;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancerClientConfiguration;
import com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration;
import com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration;
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.serviceregistry.AutoServiceRegistrationConfiguration;
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * @author <a href="mailto:[email protected]">zhangbinhub</a>
 **/
public class NacosDiscoveryLoadBalancerConfigurationTest {

	private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
			.withConfiguration(AutoConfigurations.of(
					AutoServiceRegistrationConfiguration.class,
					NacosServiceRegistryAutoConfiguration.class,
					UtilAutoConfiguration.class,
					UtilIPv6AutoConfiguration.class,
					NacosServiceAutoConfiguration.class,
					NacosDiscoveryAutoConfiguration.class,
					NacosDiscoveryClientConfiguration.class,
					LoadBalancerAutoConfiguration.class, this.getClass()));

	@Test
	public void testNacosLoadBalancerEnabled() {
		contextRunner.withPropertyValues("spring.cloud.loadbalancer.nacos.enabled=true")
				.withConfiguration(AutoConfigurations.of(
						LoadBalancerNacosAutoConfiguration.class,
						NacosLoadBalancerClientConfiguration.class))
				.run(context -> {
					assertThat(context).hasSingleBean(LoadBalancerAlgorithm.class);
					assertThat(context).hasBean("nacosLoadBalancer");
				});
	}

	@Test
	public void testNacosLoadBalancerDisabled() {
		contextRunner.withPropertyValues("spring.cloud.loadbalancer.nacos.enabled=false")
				.withConfiguration(AutoConfigurations.of(
						LoadBalancerNacosAutoConfiguration.class,
						NacosLoadBalancerClientConfiguration.class))
				.run(context -> {
					assertThat(context).doesNotHaveBean(LoadBalancerAlgorithm.class);
					assertThat(context).doesNotHaveBean("nacosLoadBalancer");
				});
	}

}