1

Я недавно модернизировал Spring Загрузочный проект от 1,1 до 1,4 и вдруг, тест на «/ здоровье» конечной начал обваливатьсяMockRestServiceServer не обновляет restTemplate по времени для здоровья конечной

@SpringBootTest 
class HealthTest extends Specification { 

    @Autowired 
    RestTemplate thirdPartyRestTemplate 

    def 'should set health status based on third party service'() { 
    given: 
    MockRestServiceServer thirdPartyServerMock = MockRestServiceServer.createServer(thirdPartyRestTemplate) 

    thirdPartyServerMock 
     .expect(MockRestRequestMatchers.requestTo('/status')) 
     .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) 
     .andRespond(MockRestResponseCreators.withStatus(thirdPartyServerResponse).body('{}')) 

    when: 
    def response = RestAssured.given().get('/health') 
    println(response.statusCode) 
    Map health = response.as(Map) 

    then: 
    thirdPartyServerMock.verify() 
    health == expectedHealth 

    where: 
    thirdPartyServerResponse  | expectedHealth 
    HttpStatus.OK     | [status: 'UP', thirdPartyServer: 'UP'] 
    HttpStatus.SERVICE_UNAVAILABLE | [status: 'DOWN', thirdPartyServer: 'DOWN'] 
    } 

} 

Что происходит : первый тест всегда проходит, а второй всегда терпит неудачу. Выход 200 200. То же самое происходит, если порядок обратный, так

where: 
    thirdPartyServerResponse  | expectedHealth 
    HttpStatus.SERVICE_UNAVAILABLE | [status: 'DOWN', thirdPartyServer: 'DOWN'] 
    HttpStatus.OK     | [status: 'UP', thirdPartyServer: 'UP'] 

На этот раз, он терпит неудачу с 503 503. Если добавить Thread.sleep линии до фактического вызова REST, как этот

when: 
    Thread.sleep(1000) 
    def response = RestAssured.given().get('/health') 

тогда он проходит каждый раз! Итак, похоже, что Spring внес некоторые изменения в MockRestServiceServer и что для настройки макета требуется некоторое время (возможно, это выполняется в отдельном потоке).

У кого-нибудь была схожая проблема? Как обойти это исправление Thread.sleep и как объяснить это поведение?

ответ

0

Оказалось, что Spring представил механизм кэширования для конечной точки работоспособности и по умолчанию кэширует результаты в течение 1 секунды. Из документов:

# Time to live for cached result, in milliseconds.  
endpoints.health.time-to-live=1000 

После того, как я изменил конфиг в:

endpoints: 
    health: 
    time-to-live: 0 

тест начали проходить снова.

 Смежные вопросы

  • Нет связанных вопросов^_^