java - 如何从 ServerResponse 获取字符串形式的正文进行测试?

标签 java spring reactive-programming spring-webflux server-response

假设我们有一个 o.s.w.reactive.function.server.ServerResponse 实例。

获取其正文内容的正确方法是什么,换句话说,如何实现fetchBodyAsString函数?

test(){
  ServerResponse response = getResponseFromService("mock data");

  String body = fetchBodyAsString(response);

  assertEquals("hello", body);
}

您能否详细说明一下为什么 ServerResponse 对所有内容都有方法(cookies()、headers()、statusCode()),但响应正文却没有?我想应该有一种方法可以使用 writeTo() 方法获取正文,尽管如何使用它绝对是模糊的。

最佳答案

我正在挖掘类似的用于单元测试目的的东西,并将以下代码缝合在一起。它是用 Kotlin 编写的,但应该相对容易转换为 Java 并解决您的问题(尽管它看起来确实有点 hacky)。

    fun fetchBodyAsString(serverResponse: ServerResponse): String {
        val DEFAULT_CONTEXT: ServerResponse.Context = object : ServerResponse.Context {
            override fun messageWriters(): List<HttpMessageWriter<*>> {
                return HandlerStrategies.withDefaults().messageWriters()
            }

            override fun viewResolvers(): List<ViewResolver> {
                return Collections.emptyList()
            }
        }

        // Only way I could figure out how to get the ServerResponse body was to have it write to an exchange
        val request = MockServerHttpRequest.get("http://thisdoenstmatter.com").build()
        val exchange = MockServerWebExchange.from(request)
        serverResponse.writeTo(exchange, DEFAULT_CONTEXT).block()
        val response = exchange.response
        return response.bodyAsString.block()!!
    }

基本上需要创建一个假的 MockServerWebExchange 并将 ServerResponse 写入其中,以将其转换为 MockServerHttpResponse,您可以从中提取 react body 出来相当无痛。这绝对不优雅,但它有效。

另请注意,我没有测试上述函数本身,只是测试它的编译情况。它应该可以工作,因为函数的内部代码正是我们正在使用的。

至于您关于ServerResponse的其他问题,我不知道答案,但也很好奇!

关于java - 如何从 ServerResponse 获取字符串形式的正文进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60740572/

相关文章:

java - 在bash中编译并启动java文件而不保存编译文件

java - 如何使用 RxJava 2 来安排重试竞赛?

rxjs - rxjs 中第一次发射的 BufferCount(2, 1)

java - 使用 RxJava 2 异步读取文件

java - 是什么导致我的 GWT 应用程序出现 HTTP 503 错误?

java - Lambda 表达式 java 8 异常 : java. lang.NoSuchMethodError : java. lang.invoke.LambdaMetafactory.metaFactory

java - 如何将 Android Activity 转换为界面?

java - 使用深度链接启动 Android 应用程序

spring - 如何在Spring Boot属性中设置Tomcat的SlowQueryReport拦截器的阈值

spring - spring-boot-starter-data-elasticsearch导致未知设置analyzer/search_analyzer和index.settings.analysis.analyzer.autocomplete