如何对 Feign 客户端进行挡板测试 (Stub Test)

# 简介

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

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

# 适用场景

  • 依赖的第三方服务在公网无法访问, 需要模拟第三方服务的响应与行为.
  • 依赖的第三方服务会消耗真实的资源, 需要模拟第三方服务的响应与行为.

# 定义一个 Feign 客户端:

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

@Primary
@FeignClient(value = "search-engine-for-stub-test", url = "https://cn.bing.com", primary = false)
interface SearchEngineForStubTest {

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

# 定义一个挡板

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

@Primary
@Component
class SearchEngineStub implements SearchEngineForStubTest {

    @Override
    public String index() {
        return "Stub invoked";
    }
}

# 编写挡板测试

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

@SpringBootTest
public class SearchEngineStubTests {

    @Autowired
    private SearchEngineForStubTest searchEngineForStubTest;

    @Test
    void test() {
        Assertions.assertTrue(searchEngineForStubTest instanceof SearchEngineStub);
        Assertions.assertEquals("Stub invoked", searchEngineForStubTest.index());
    }
}

# 小结

Feign 客户端进行挡板测试需要注意以下几点:

  • 正式环境里的客户端需要将 @FeignClient 注解的 primary 属性设置为 false
  • 测试环境里需要将挡板用 @Primary 进行注解

否则会在运行测试的过程中出现依赖冲突或找不到合适地依赖的情况.

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

# 推广

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

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