From 7565c51dc58a7ff6528834b153353b825715b873 Mon Sep 17 00:00:00 2001 From: leestana01 Date: Fri, 5 Jun 2026 19:03:41 +0900 Subject: [PATCH] Restore thread interrupt flag in DefaultMvcResult 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. Closes gh-36876 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 f39a6fe0127..72917180f03 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 @@ class DefaultMvcResult implements MvcResult { 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 5fae7806a68..28c4c86d829 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.junit.jupiter.api.Test; 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 @@ class DefaultMvcResultTests { 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(); + } + } + }