当前位置: 首页 > 知识库问答 >
问题:

MockRestServiceServer未及时更新运行状况终结点的restTemplate

夏元明
2023-03-14

我最近将SpringBoot项目从1.1升级到1.4,突然,“/health”endpoint的测试开始失败

@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。如果顺序颠倒,也会发生同样的情况,所以

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

这一次,503失败了。如果我添加线程。在像这样的实际Rest电话之前先睡一觉

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

那它每次都会过去!因此,Spring似乎在MockRestServiceServer中引入了一些更改,并且需要一些时间来配置一个模拟(可能现在在单独的线程中执行)。

有人有类似的问题吗?如何绕过此线程。睡眠修复和这种行为的解释是什么?

共有1个答案

茅鸿宝
2023-03-14

事实证明,Spring为健康endpoint引入了缓存机制,默认情况下,它将结果缓存1秒。从文档中:

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

一旦我将配置更改为:

endpoints:
  health:
    time-to-live: 0

考试又开始通过了。

 类似资料:
  • 我已经用spring Security保护了我的spring boot应用程序(基本身份验证)。我为可以使用监视和管理的用户添加了角色管理。我设置management.security.roles=management。具有此角色的用户只能看到状态(使用运行状况终结点)。如果我设置management.security.role=management,则一切正常(具有此角色的用户可查看所有健康参数

  • 我有一个WebFlux、Health Actuctor和Spring Security的项目。我正在尝试构建自定义身份验证,但该身份验证也会在健康执行器endpoint上发挥作用。我怎样才能禁用它? 根据文档,我实现了一个自定义的,下面是它的基本版本: 根据文档,不应该要求我进行任何额外的配置来禁用健康endpoint上的身份验证。以下是中的配置: 尽管添加了此功能,但仍会导致状态代码也是。如何禁

  • 我的团队将我们的微服务从Spring Boot1迁移到了版本2,由于执行器发生了变化,我们通过prometheus jmx exporter导出的健康endpoint度量不再起作用。 通常的/acture/health按预期工作,但prometheus-jmx-exporter无法接收它,尽管尝试了几个方法: 我更改了exporter-config.yaml中的元信息,以反映Spring Boot

  • 在我的项目中,我不想使用。我的application.java有、和注释。 我在pom.xml中添加了Spring Boot执行器依赖项。但是,当我尝试访问时,得到的是404。我相信我需要指定一些配置类作为导入注释的一部分。我需要帮助弄清楚配置是什么。

  • 我试图为部署到k8s的应用程序设置就绪探测,但在执行器/健康endpoint下,与执行器/健康/就绪endpoint相比,我得到了不同的状态。 重要的是,只有当应用程序部署到k8s集群时,才会观察到这种行为。 因此,在应用程序中没有任何额外的配置。属性我正在获取的文件: 这似乎是正确的——如果准备状态是,健康endpoint也会返回,因为它包括组。这至少是一致的。 另一方面,当我在应用程序中指定准

  • 我将Drools与Eclipse和Maven一起用于一个进行许多模式匹配的应用程序。我想使用KieScanner自动更新正在运行的KieSession,而无需重新启动应用程序。但这似乎不起作用。 我使用的是7.24.0。t043用于组织。kie和org。流口水。 我只使用我的本地Maven存储库,所以我已经指定了路径并在我的settings.xml.中设置为true,我还验证了使用最新版本创建一个