Http RestTemplate в модульном тесте не вызывает откат Hystrix - PullRequest
0 голосов
/ 07 марта 2019

Я провожу модульное тестирование метода обслуживания, в котором (ложный) шаблон отдыха используется для отправки запроса другому сервису.Он имеет свойство @HystrixCommand для вызова резервного метода, если это необходимо.В тесте это работает, как я, за исключением того, что, когда шаблон оставшегося значения возвращает неверный запрос, вызывается резервный метод.Тем не менее, я попытался выполнить модульное тестирование и вручную заставить шаблон макета остатка вернуть Http 400 Bad Request.Я удивился, увидев, что это не запускает запасной вариант Hystrix.Кто-нибудь знает почему?

@Autowired
private RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "fallback")
public SomeResponse restCall(SomeRequest request) {
    HttpEntity<Object> httpEntityRequest = new HttpEntity<>(request);
    ResponseEntity<R> response = restTemplate.exchange(
            "http://localhost:5000/otherservice,
            HttpMethod.POST,
            httpEntityRequest,
            responseClass);

    if (response != null) 
        return response.getBody();
    else 
        return new SomeResponse();
}

private SomeResponse fallback(SomeRequest request) {
    log.error("Log Error);
    return null;
}

Мой юнит-тест:

@Mock
private Appender<ILoggingEvent> mockAppender;

@Captor
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;

@MockBean
private RestTemplate mockRestTemplate;

@Autowired
private SomeService service;

@Before
public void setUp() {
    Logger logger = (Logger) 
    LoggerFactory.getLogger(SomeServiceTest.class);
    logger.addAppender(mockAppender);
}

@Test
public void restCallTest() {
    ResponseEntity<SomeResponse> response = new ResponseEntity<>(HttpStatus.BAD_REQUEST);

    when(mockRestTemplate.exchange(anyString(), any(), any(), eq(BannerResponse.class))).thenReturn(response);

    SomeResponse someResponse = service.fallback(new SomeRequest());

    verify(mockRestTemplate, times(1)).exchange(anyString(), any(), any(), eq(SomeResponse.class));
    verify(mockAppender).doAppend(captorLoggingEvent.capture());

    assertThat(captorLoggingEvent.getValue().toString(), containsString("Log error"));
    assertNull(someResponse);
}

С уважением,

...