在不启动完全应用程序的情况下测试Spring引导执行器端点

fcwjkofz  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(334)

我的spring启动应用程序配置了一个数据源,并公开了spring执行器的运行状况和prometheus度量。
应用程序.yml

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    username: ${db.username}
    password: ${db.password}
    url: jdbc:mariadb://${db.host}:${db.port}/${db.schema}

management:
  endpoints:
    web:
      exposure:
        include: 'health, prometheus'

启动应用程序时, /actuator/prometheus 提供包含度量的响应。现在我想为 prometheus 终结点。目前情况如下:
测试等级

@SpringBootTest
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
public class HealthMetricsIT {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldProvideHealthMetric() throws Exception {
        mockMvc.perform(get("/actuator/prometheus")).andExpect(status().isOk());
    }
}

然而,我在这里遇到了两个问题,我还不知道如何解决它们。

第1期

通过这种设置,测试似乎启动了整个应用程序,从而尝试连接到正在运行的数据库。
测试无法正确启动,因为数据源属性的前缀为 db 未提供。
如何在不打开数据库连接的情况下启动此测试?

第2期

即使我的本地数据库正在运行 db 属性,则测试失败。这次是因为我得到的是HTTP404而不是200。

yyhrrdl8

yyhrrdl81#

作为 MockMvc 用于测试SpringMVC组件(您的 @Controller 以及 @RestController )我猜您使用的是自动配置的模拟servlet环境 @AutoConfigureMockMvc 不会包含任何执行器终结点。
相反,您可以编写一个不使用 MockMvc 而是启动嵌入式servlet容器。

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
// @ExtendWith(SpringExtension.class) can be omitted with recent Spring Boot versions
public class HealthMetricsIT {

    @Autowired
    private WebTestClient webTestClient; // or TestRestTemplate

    @Test
    public void shouldProvideHealthMetric() throws Exception {
      webTestClient
       .get()
       .uri("/actuator/health")
       .exchange()
       .expectStatus().isOk();
    }
}

对于这个测试,您必须确保应用程序启动时所需的所有基础结构组件(数据库等)都可用。
使用testcontainers,您几乎可以毫不费力地为集成测试提供一个数据库。

相关问题