Spring Cloud Contract 测试由于拦截器 preHandle 方法在 HttpServletRequest 上设置字段而失败

问题描述 投票:0回答:1

我有一个带有 preHandle 方法的 Spring Boot 拦截器,可以执行一些逻辑。在 preHandle 方法中,我调用身份验证服务来获取客户端 ID,然后在 HttpServletRequest 上设置该客户端 ID。然后,我的控制器使用客户端 ID 作为参数之一来调用我的服务。

这导致我的 Spring Cloud Contract 测试失败。我知道这一点是因为当单步执行调试器时,客户端 ID 为空,当我硬编码客户端 ID 时,测试通过。我尝试存根 HttpServletRequest.getAttribute 方法,但这不起作用。我也可以通过存根服务方法来通过 SCC 测试,但我认为这是不好的做法。

有人可以向我解释一下 SCC 测试期间到底发生了什么吗?例如,如果没有存根存储库方法等,看起来它正在逐步执行所有逻辑,即使它实际上没有查询数据库,但在调用存储库方法后会有一个返回值。当我没有运行数据库时,它会导致测试失败。只要传入正确的参数类型,它是否只是为方法调用创建一些模拟值?

spring-boot interceptor spring-cloud-contract
1个回答
0
投票

添加以下内容后,SCC 测试通过:

@TestPropertySource(properties = {
    "spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE",
    "spring.datasource.driverClassName=org.h2.Driver",
    "spring.datasource.username=sa",
    "spring.datasource.password=sa",
    "spring.jpa.database-platform=org.hibernate.dialect.H2Dialect",
    "spring.jpa.hibernate.ddl-auto=none",
    // "spring.sql.init.mode=always",
    "spring.datasource.initialization-mode=always",

})

我还在 /src/test/resources 下添加了一个 schema.sql 文件,其中包含我的所有表。但是我不太确定为什么会这样。之前我的数据库正在运行,但现在切换到 H2 数据库,但 H2 数据库未填充。

© www.soinside.com 2019 - 2024. All rights reserved.