如何对 Feign 客户端的降级处理进行单元测试 (Unit Test)

# 简介

本文将演示如何在以下约束条件下对 Feign 客户端进行测试:

  • 有降级处理的 Feign 客户端
  • 单元测试需要通过
  • 应用本身需要能顺利启动

# 适用场景

  • 被依赖的第三方服务响应时间不稳定, 需要将部分请求降级处理以免拖垮己方服务.
  • 被依赖的第三方服务在不可用时有替代方案.

# 定义一个 Feign 客户端:

/src/main/dev/dengchao/SearchEngineWithFallbackForUnitTest.java:

@FeignClient(value = "search-engine-with-fallback-for-unit-test", url = "http://localhost",
        fallback = SearchEngineWithFallbackForUnitTest.Fallback.class)
interface SearchEngineWithFallbackForUnitTest {

    @GetMapping("/")
    String index();

    @Component
    class Fallback implements SearchEngineWithFallbackForUnitTest {
    
        @Override
        public String index() {
            return "Fallback triggered";
        }
    }
}

# 编写单元测试

/src/test/dev/dengchao/SearchEngineWithFallbackUnitTests.java:

@SpringBootTest
public class SearchEngineWithFallbackUnitTests {

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    private SearchEngineWithFallbackForUnitTest searchEngineWithFallbackUnitTest;

    @Test
    void test() {
        assertFalse(searchEngineWithFallbackUnitTest instanceof SearchEngineWithFallbackForUnitTest.Fallback);
        assertEquals("Fallback triggered", searchEngineWithFallbackUnitTest.index());
    }
}

# 小结

Feign 客户端的降级处理进行单元测试时需要注意以下几点:

  • IDEA 错误的认为 SearchEngineWithFallbackForUnitTest 的依赖注入会出现冲突, 但实际上并不会. 因此需要使用 @SuppressWarnings 抑制注入 SearchEngineWithFallbackForUnitTest 对象时出现的警告.
  • 测试时需要对 Feign 客户端设置合适的降级触发条件, 比如 readTimeout .

相关代码已发布至 GitHub: Spring Cloud OpenFeign Test Demo (opens new window)

# 推广

欢迎加入 Spring Cloud 交流群: 617143034 (opens new window)

欢迎大家点击下方的图片领取限量 阿里云优惠券 (opens new window), 新购续费更优惠: 限量阿里云优惠券 (opens new window)