MockWebServer.class의 TruncationBuffer의 timeout()함수

MockWebServer.TruncationBuffer.timeout()
// 응답을 더 이상 쓰지 않고, 소켓을 열린 채로 유지해서 클라이언트가 read timeout에 걸리게 한다.

 

테스트에서 “응답을 일부러 끊어버리는(truncate)” 시나리오를 만들기 위해 사용

주 용도는 클라이언트의 timeout / 읽기 중단 / 불완전 응답 처리 로직을 검증

 

how?

MockWebServer가 응답 바디를 전부 보내지 않고 중간에 끊기도록 한다.

정상적인 HTTP 응답처럼 headers는 내려가지만, body를 일부만 쓰고 연결을 끊거나, 더 이상 쓰지 않음

  • TruncationBuffer가 body를 제어한다.
  • timeout()이 호출되면, OutputStream에서 더 이상 write을 하지 않음
  • connection을 close하지도 않음

클라이언트는...

  • 계속 read()를 시도
  • 그러나 데이터가 안 오므로
  • 클라이언트 본인의 readTimeout, responseTimeout에 걸리게된다.

그래서 SocketTimeoutException이나 ReadTimeoutException이 발생하게 된다. (WebClient라면 ReadTimeoutException이나 TimeoutException 계열)

 

when use?

  • 서버가 응답 도중 죽은 경우
  • 네트워크 장애로 body를 끝까지 못 읽은 경우
  • read timeout이 발생하는 상황

Example

val response = MockResponse()
    .setResponseCode(200)
    .setBodyDelay(0, TimeUnit.MILLISECONDS)
    .setBody(
        MockWebServer.TruncationBuffer()
            .timeout() // 응답을 더 이상 쓰지 않고, 소켓을 열린 채로 유지해서 클라이언트가 read timeout에 걸리게 한다.
    )

mockWebServer.enqueue(response)

 

  • 즉시 연결을 닫지 않는다
  • 에러를 던지지 않는다
  • 아무 것도 쓰지 않고 기다린다
  • 그 결과, 클라이언트 쪽에서 timeout이 발생한다

 

TruncationBuffer 함수 정리

  mockWebServer의 행동 클라이언트 입장
truncate(n) n바이트만 쓰고 종료 body 일부만 읽힘
disconnect() 즉시 소켓 close connection reset / EOF
timeout() 아무 것도 안 쓰고 대기 read timeout 발생

 

 

 

Junit assertTmeout 과 다른점은?

  TruncationBuffer.timeout JUnit assertTimeout
위치 서버 시뮬레이션 테스트 실행 시간
목적 네트워크 timeout 재현 테스트 코드 성능 제한
발생 예외 Socket / Read timeout AssertionError
실무 의미 운영 장애 시나리오 테스트 보호 장치