При тестировании запасного поведения Hystrix для моего Feign API я получаю сообщение об ошибке, когда ожидаю, что оно будет успешным.
Имитация интерфейса:
Это 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
}
}
файлы конфигурации
application.yml
Эти файлы показывают конфигурацию, которая может быть актуальной:
feign:
hystrix:
enabled: true
test / application.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);
}
}
LibraryController
@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";
}
}
Других классов нет.
SpringBootTest
. Это полная трассировка стека? Если вы хотите провести интеграционный тест, существуют другие тесты срезов и т. Д., Которые подойдут лучше, и разложение любого сканирования компонентов наConfigurations
и определение того, какие компоненты необходимо загрузить, может помочь с этими проблемами. - person Darren Forsythe   schedule 20.02.2018