Back to Repositories

Testing Sentinel Feign Lazy Loading Integration in Spring Cloud Alibaba

This test suite evaluates the lazy loading functionality of Sentinel Feign clients in Spring Cloud Alibaba. It verifies the proper initialization and fallback behavior of Feign clients when integrated with Sentinel circuit breaker capabilities.

Test Coverage Overview

The test suite provides comprehensive coverage of Sentinel Feign client functionality with lazy attribute resolution enabled.

Key areas tested include:
  • Context loading and dependency injection of multiple Feign services
  • Fallback behavior for echo and foo services
  • Exception handling for bar and baz services
  • Object equality and hash code verification

Implementation Analysis

The testing approach utilizes Spring Boot test framework with JUnit4 integration. It employs SpringRunner for test execution and leverages Spring’s dependency injection to test Feign clients. The implementation specifically tests lazy attribute resolution through the ‘spring.cloud.openfeign.lazy-attributes-resolution=true’ property setting.

The test patterns focus on verifying both successful fallback scenarios and exception cases, ensuring robust circuit breaker behavior.

Technical Details

Testing tools and configuration:
  • JUnit 4 test framework
  • Spring Boot Test context
  • AssertJ for assertions
  • Sentinel Feign integration enabled via properties
  • Multiple service interfaces: EchoService, FooService, BarService, BazService
  • Lazy attributes resolution configuration

Best Practices Demonstrated

The test suite exemplifies several testing best practices for Spring Cloud applications.

  • Proper test isolation using SpringBootTest
  • Comprehensive service verification including null checks
  • Explicit exception testing using assertThatThrownBy
  • Clear separation of different test scenarios
  • Verification of object contract methods (equals, hashCode, toString)

alibaba/spring-cloud-alibaba

spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelFeignLazilyTests.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.sentinel;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

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

/**
 * @author <a href="mailto:[email protected]">Jim</a>
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SentinelFeignTests.TestConfig.class},
		properties = {"feign.sentinel.enabled=true", "spring.cloud.openfeign.lazy-attributes-resolution=true"})
public class SentinelFeignLazilyTests {

	@Autowired
	private SentinelFeignTests.EchoService echoService;

	@Autowired
	private SentinelFeignTests.FooService fooService;

	@Autowired
	private SentinelFeignTests.BarService barService;

	@Autowired
	private SentinelFeignTests.BazService bazService;

	@Test
	public void contextLoads() throws Exception {
		assertThat(echoService).isNotNull();
		assertThat(fooService).isNotNull();
	}

	@Test
	public void testFeignClient() {
		assertThat(echoService.echo("test")).isEqualTo("echo fallback");
		assertThat(fooService.echo("test")).isEqualTo("foo fallback");

		assertThatThrownBy(() -> {
			barService.bar();
		}).isInstanceOf(Exception.class);

		assertThatThrownBy(() -> {
			bazService.baz();
		}).isInstanceOf(Exception.class);

		assertThat(fooService.toString()).isNotEqualTo(echoService.toString());
		assertThat(fooService.hashCode()).isNotEqualTo(echoService.hashCode());
		assertThat(echoService.equals(fooService)).isEqualTo(Boolean.FALSE);
	}

}