Spring

테스트를 위해 ServerResponse에서 본문을 문자열로 가져오는 방법은 무엇입니까?

기록만이살길 2022. 12. 8. 23:19
반응형

테스트를 위해 ServerResponse에서 본문을 문자열로 가져오는 방법은 무엇입니까?

1. 질문(문제점):

의 인스턴스가 있다고 가정합니다 o.s.w.reactive.function.server.ServerResponse.

본문의 내용을 가져오는 적절한 방법, 즉 fetchBodyAsString기능을 구현하는 방법은 무엇입니까?

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

  String body = fetchBodyAsString(response);

  assertEquals("hello", body);
}

Response body이 아닌 ServerResponse모든 항목( )에 대한 메소드 가 있는 이유에 대해 조금 더 자세히 설명해 주시겠습니까? cookies(), headers(), statusCode()방법으로 몸을 얻는 방법이 있어야 한다고 생각합니다 writeTo(). 비록 그것을 사용하는 방법은 절대적으로 모호합니다.

2. 해결방안:

단위 테스트 목적으로 비슷한 것을 파고 들었고 아래 코드를 함께 꿰매었습니다. Kotlin에 있지만 Java로 번역하고 문제를 해결하는 것이 상대적으로 쉬워야 합니다.

    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()!!
    }

기본적으로 가짜를 만들고 꽤 고통 없이 Response body을 꺼낼 수 있는 것으로 변환하기 위해 작성해야 했습니다 MockServerWebExchange. 이것은 확실히 우아하지는 않지만 작동합니다.ServerResponseMockServerHttpResponse

또한 위의 함수 자체를 테스트하지 않았으며 단지 컴파일된다는 점에 유의하십시오. 함수의 내부 코드가 정확히 우리가 사용하는 것이기 때문에 작동해야 합니다.

에 대한 귀하의 다른 질문에 대해서는 ServerResponse답을 모르지만 그것에 대해서도 궁금합니다!

반응형