From d323b08e52b2717ddfd8ee6417637c5584edacf4 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Fri, 5 Jun 2026 19:03:41 +0900 Subject: [PATCH] DefaultMvcResult does not restore thread interrupt flag when catching InterruptedException awaitAsyncDispatch() catches InterruptedException, returns false, and discards the interruption. Catching InterruptedException without rethrowing should restore the interrupt status (as is done across the framework's main sources), so re-assert it before returning false. Signed-off-by: leestana01 --- .../test/web/servlet/DefaultMvcResult.java | 1 + .../test/web/servlet/DefaultMvcResultTests.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java b/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java index f39a6fe0127f..72917180f03e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java @@ -153,6 +153,7 @@ private boolean awaitAsyncDispatch(long timeout) { return this.asyncDispatchLatch.await(timeout, TimeUnit.MILLISECONDS); } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); return false; } } diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/DefaultMvcResultTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/DefaultMvcResultTests.java index 5fae7806a683..28c4c86d8295 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/DefaultMvcResultTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/DefaultMvcResultTests.java @@ -22,6 +22,7 @@ import org.springframework.mock.web.MockHttpServletRequest; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; /** @@ -46,4 +47,19 @@ void getAsyncResultFailure() { this.mvcResult.getAsyncResult(0)); } + @Test + void getAsyncResultRestoresInterruptStatusWhenInterrupted() { + this.mvcResult.setAsyncDispatchLatch(new CountDownLatch(1)); + Thread.currentThread().interrupt(); + try { + assertThatIllegalStateException().isThrownBy(() -> + this.mvcResult.getAsyncResult(1000)); + assertThat(Thread.currentThread().isInterrupted()).isTrue(); + } + finally { + // Clear the interrupt status so it does not leak to other tests. + Thread.interrupted(); + } + } + }