欢迎加入 Spring Cloud 交流群: 617143034
本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.
简介
本文将演示如何在以下约束条件下对 Feign 客户端进行测试:
- 有降级处理的 Feign 客户端
- 需要通过挡板测试
- 应用本身需要能顺利启动
适用场景
- 依赖的第三方服务在公网无法访问, 需要模拟第三方服务的响应与行为.
- 依赖的第三方服务会消耗真实的资源, 需要模拟第三方服务的响应与行为.
定义一个 Feign 客户端:
// /src/main/dev/dengchao/SearchEngineWithFallbackForStubTest
@Priority(1)
@FeignClient(value = "search-engine-with-fallback-for-stub-test", url = "https://cn.bing.com", primary = false,
fallback = SearchEngineWithFallbackForStubTest.Fallback.class)
interface SearchEngineWithFallbackForStubTest {
@GetMapping("/")
String index();
@Component
@Priority(2)
class Fallback implements SearchEngineWithFallbackForStubTest {
@Override
public String index() {
throw new RuntimeException("Fallback should not be triggered in this case");
}
}
}
定义一个挡板
// /src/test/dev/dengchao/SearchEngineWithFallbackStub.java
@Primary
@Component
class SearchEngineWithFallbackStub implements SearchEngineWithFallbackForStubTest {
@Override
public String index() {
return "Stub invoked";
}
}
编写挡板测试
// /src/test/dev/dengchao/SearchEngineWithFallbackStubTests
@SpringBootTest
public class SearchEngineWithFallbackStubTests {
@Autowired
private SearchEngineWithFallbackForStubTest searchEngineWithFallbackStubTest;
@Test
void test() {
Assertions.assertTrue(searchEngineWithFallbackStubTest instanceof SearchEngineWithFallbackStub);
Assertions.assertEquals("Stub invoked", searchEngineWithFallbackStubTest.index());
}
}
小结
对有降级处理的 Feign 客户端进行挡板测试时需要注意以下几点:
- 正式环境里需要用
@Priority
注解调整 Feign 客户端与降级处理的优先级 - 正式环境里的客户端需要将
@FeignClient
注解的primary
属性设置为false
- 测试环境里需要将挡板用
@Primary
进行注解
否则会在运行测试的过程中出现依赖冲突或找不到合适的依赖的情况.
相关代码已发布至 GitHub: Spring Cloud OpenFeign Test Demo
推广
欢迎加入 Spring Cloud 交流群: 617143034
欢迎大家使用阿里云优惠券, 新购续费更优惠: