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 |
| 실무 의미 | 운영 장애 시나리오 | 테스트 보호 장치 |
'┝ framework > ┎ Spring' 카테고리의 다른 글
| [docker newbie] spring boot 서버를 도커 컨테이너 안에서 실행하기 (feat 자동 빌드) (0) | 2026.01.12 |
|---|---|
| [testcode] webClient의 retryWhen testcode 작성하기 (0) | 2025.12.26 |
| timeout 관련 assertion (0) | 2025.12.26 |
| [testcode] timeout을 발생하는 테스트코드 (0) | 2025.12.26 |
| Spring에서 객체를 Bean으로 관리하는 이유를 설명해주세요. (0) | 2025.12.23 |