Back to Repositories

Testing Nacos Discovery HeartBeat Configuration in Spring Cloud Alibaba

This test suite validates the heart beat configuration functionality in Nacos Discovery for Spring Cloud Alibaba. It ensures proper initialization and conditional enabling of the heart beat publisher component based on different configuration scenarios.

Test Coverage Overview

The test suite provides comprehensive coverage of the NacosDiscoveryHeartBeatConfiguration class, focusing on different initialization scenarios. Key test cases include:

  • Default configuration validation
  • Gateway-triggered heart beat publisher activation
  • Property-based heart beat publisher enablement

Implementation Analysis

The testing approach utilizes Spring Boot’s ApplicationContextRunner for simulating different application contexts and configurations. It employs a builder pattern to configure test scenarios and validates bean creation and availability using AssertJ assertions.

Technical Details

Testing tools and configuration include:

  • JUnit Jupiter for test execution
  • Spring Boot Test Context framework
  • AssertJ for assertions
  • AutoConfigurations for multiple Spring Cloud and Nacos components
  • Property-based configuration testing

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Isolated test context for each scenario
  • Clear test method naming conventions
  • Proper separation of concerns in test cases
  • Effective use of Spring Boot testing utilities
  • Comprehensive configuration testing

alibaba/spring-cloud-alibaba

spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryHeartBeatConfigurationTest.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.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 static org.assertj.core.api.Assertions.assertThat;

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

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

	@Test
	public void testDefaultNacosDiscoveryHeartBeatPublisher() {
		contextRunner.run(context ->
				assertThat(context).doesNotHaveBean(NacosDiscoveryHeartBeatPublisher.class)
		);
	}

	@Test
	public void testNacosDiscoveryHeartBeatPublisherEnabledForGateway() {
		contextRunner
				.withPropertyValues("spring.cloud.gateway.discovery.locator.enabled=true")
				.run(context ->
						assertThat(context).hasSingleBean(NacosDiscoveryHeartBeatPublisher.class)
				);
	}

	@Test
	public void testNacosDiscoveryHeartBeatPublisherEnabledForProperties() {
		contextRunner
				.withPropertyValues("spring.cloud.nacos.discovery.heart-beat.enabled=true")
				.run(context ->
						assertThat(context).hasSingleBean(NacosDiscoveryHeartBeatPublisher.class)
				);
	}

}