Тестирование отката Hystrix через Feign API: com.netflix.client.ClientException: балансировщик нагрузки не имеет доступного сервера для клиента

При тестировании запасного поведения 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";
    }

}

Других классов нет.


person Eric Turley    schedule 15.02.2018    source источник
comment
Можете ли вы добавить свой основной класс приложения?   -  person Darren Forsythe    schedule 20.02.2018
comment
@DarrenForsythe добавил   -  person Eric Turley    schedule 20.02.2018
comment
Я не могу воссоздать проблему со скелетным проектом с вашим кодом. Если возможно, можно будет увидеть весь исходный код. Это может быть проблема загрузки других bean-компонентов, которая произойдет в SpringBootTest. Это полная трассировка стека? Если вы хотите провести интеграционный тест, существуют другие тесты срезов и т. Д., Которые подойдут лучше, и разложение любого сканирования компонентов на Configurations и определение того, какие компоненты необходимо загрузить, может помочь с этими проблемами.   -  person Darren Forsythe    schedule 20.02.2018
comment
@DarrenForsythe Добавлен единственный другой класс: LibraryController. Pom.xml создан на основе инициализатора Spring Boot 1.5.9.RELEASE с запусками web, hystrix, eureka, fign.   -  person Eric Turley    schedule 21.02.2018


Ответы (1)


так! Мне удалось воссоздать проблему, спасибо за добавление кода, пришлось немного поиграть с ней, так как я не был уверен, как выглядит BookClientService, и не имело смысла реализовывать BookAPI, поскольку это будет внутренняя позвони, например, в вашем приложении, а не внешний вызов API с Feign.

В любом случае,

Я опубликовал свою версию того, что вы здесь предоставили.

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

Проблема была решена, когда я переименовал второй application.yml, который находится в папке src/test/resources, на application-test.yml, который объединит свойства.

Проблема была вызвана тем фактом, что второй источник свойств, тестируемый, переопределяет исходный application.yml и отключает hystrix, поскольку Hystrix отключен, нет возможности вернуться к нему, и он вызывает основную причину того, что вызовет откат, отсутствие сервера для вызова Book API. Переименование его в application-test всегда будет загружаться в контексты весенних тестов. Вы можете решить эту проблему с помощью встроенных свойств или профилей.

Я добавил еще один тест, отключающий feign / w hystrix в тесте, который воссоздает полученную вами ошибку.

person Darren Forsythe    schedule 21.02.2018
comment
Успешно справился! Спасибо :) - person Eric Turley; 24.02.2018
comment
Я всегда хочу, чтобы свойства теста объединялись с application.yml, и мне не хотелось указывать тестовый профиль, поэтому я переименовал application-test.yml в application-default.yml. - person Eric Turley; 26.02.2018