通过Feign API测试Hystrix回退:com.netflix.client.ClientException:负载



在测试我的Feign API的Hystrix回退行为时,当我期望它成功时,我得到了一个错误。

假装接口:

这是外部服务的 API。

@FeignClient(name = "book", fallback = BookAPI.BookAPIFallback.class)
public interface BookAPI {
@RequestMapping("/")
Map<String, String> getBook();
@Component
class BookAPIFallback implements BookAPI {
@Override
@RequestMapping("/")
public Map<String, String> getBook() {
Map<String, String> fallbackmap = new HashMap<>();
fallbackmap.put("book", "fallback book");
return fallbackmap;
}
}
}

测试类

此测试仅用于验证回退行为:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
public class BookServiceClientTest {
@MockBean
RestTemplate restTemplate;// <---- @LoadBalanced bean
@Autowired
private BookServiceClient bookServiceClient;
@Before
public void setup() {
when(restTemplate.getForObject(anyString(), any()))
.thenThrow(new RuntimeException("created a mock failure"));
}
@Test
public void fallbackTest() {
assertThat(bookServiceClient.getBook())
.isEqualTo(new BookAPI.BookAPIFallback().getBook().get("book")); // <--- I thought this should work
}
}

配置文件

应用程序.yml

这些文件显示可能相关的配置:

feign:
hystrix:
enabled: true

测试/应用.yml

eureka:
client:
enabled: false

问题

运行应用程序时一切正常。
但是在运行此测试时,我收到以下错误。
当然,这是一个测试,所以我无论如何都要尝试绕过查找。

java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: book
at org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:71)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:97)

我错过了什么?

增编

应用程序类

@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
@EnableFeignClients
public class LibraryApplication {
public static void main(String[] args) {
SpringApplication.run(LibraryApplication.class, args);
}
}

库控制器

@Controller
public class LibraryController {
private final BookServiceClient bookService;
public LibraryController(BookServiceClient bookServiceClient) {
this.bookService = bookServiceClient;
}
@GetMapping("/")
String getLibrary(Model model) {
model.addAttribute("msg", "Welcome to the Library");
model.addAttribute("book", bookService.getBook());
return "library";
}
}

没有其他类。

是这样!我能够重现这个问题,感谢您添加更多代码,不得不稍微玩一下,因为我不确定BookClientService是什么样子的,而且实现 BookAPI 是没有意义的,因为这将是内部调用,例如在您的应用程序中,而不是使用 Fake 的外部 API 调用。

无论如何

我推送了您在此处提供的版本。

https://github.com/Flaw101/feign-testing

当我将位于src/test/resources文件夹中的第二个application.yml重命名为将合并属性的application-test.yml时,该问题已得到解决。

该问题是由于第二个属性源(测试源)覆盖初始application.yml禁用hystrix 引起的,因为 Hystrix 被禁用,没有回退可去,它抛出了导致回退的根本原因,缺少服务器来调用BookAPI。将其重命名为application-test将始终加载到 Spring 测试上下文中。您可以使用内联属性或配置文件来解决此问题。

我在测试中添加了另一个禁用假装/w hystrix的测试,该测试会重新创建您收到的错误。

相关内容

  • 没有找到相关文章

最新更新