【问题标题】:Why doesn't Spring WebFlux MockServerRequest allow an empty body?为什么 Spring WebFlux MockServerRequest 不允许空主体?
【发布时间】:2020-12-11 04:33:47
【问题描述】:

我正在为 Spring WebFlux 应用程序编写一些测试,并且我正在尝试模拟一个请求没有正文的场景。我伸手去拿内置的MockServerRequest,我想我会使用内置的模拟而不是自己制作。它确实允许构造一个没有主体的实例,但是我的测试都失败了,因为它提取主体contain an assertion that the body is not null 的所有方法都失败了。这似乎与实际请求的行为方式不一致。完全可以在没有主体的情况下提出请求。我还想说让代码检查是否存在主体是合理的,因为存在诸如 awaitBodyOrNull 之类的方法支持(我正在使用 Kotlin)。

我在这里遗漏/误解了什么吗?我只是通过MockServerRequest.builder().build() 来构建我的模拟(被测试的方法不关心身体以外的任何东西)。这个类可能实际上并不打算单独使用吗?我没有找到其他人问这个问题,所以我觉得我一定忽略了一些东西。

现在我将通过制作自己的模拟来解决这个问题。

【问题讨论】:

  • 我没有仔细阅读发生了什么,但 Flux/Reactor 并没有在流中全部为空。你必须提交一个 Mono.empty()。因此,无论您要模拟什么,都不应在正文中返回 null,实际上它无法返回,因为流将在任何尝试尝试时中止。
  • 我将标题编辑得更清楚一些。我不是想将 null 传递给模拟构建器,我只是想模拟一个没有发送正文的请求。返回Mono.empty()(然后将被转换为 Kotlin 的null)是我所期望的行为。相反,mockRequest.awaitBodyOrNull<TestDto>() 会抛出 IllegalStateException,而不是返回 null。
  • 哦,等等,就是这样。更仔细地查看源代码,它期望你给它的主体已经被包裹在Mono 中。我假设参数类型为Object,它会为我包裹身体(或缺少身体)。如果您想将其格式化为答案,我会给您信用。否则,我将自己关闭问题。
  • 不,不用担心,很高兴您解决了问题。
  • 好吧。感谢精神上的推动。 :)

标签: spring spring-webflux spring-test


【解决方案1】:

MockServerRequest.Builder 期望你给它一个已经包裹在Mono 中的主体。它不会为你做任何包装。因此,使用MockServerRequest.builder().body(Mono.empty<TestDto>()) 模拟一个空请求。

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 2021-03-03
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2012-08-12
    • 2023-03-16
    相关资源
    最近更新 更多