diff --git a/spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java b/spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java index 0191deae128..1953bddc3b9 100644 --- a/spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java +++ b/spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java @@ -42,7 +42,7 @@ import org.springframework.util.Assert; * @param the referenced type * @see Neal Gafter on Super Type Tokens */ -public abstract class ParameterizedTypeReference { +public abstract class ParameterizedTypeReference { private final Type type; diff --git a/spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt b/spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt index 49940f57044..1ab94cddf0e 100644 --- a/spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt +++ b/spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt @@ -107,35 +107,35 @@ class RSocketRequesterExtensionsTests { suspend fun retrieveAndAwait() { val response = "foo" val retrieveSpec = mockk() - every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.just("foo") + every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.just("foo") assertThat(retrieveSpec.retrieveAndAwait()).isEqualTo(response) } @Test suspend fun retrieveAndAwaitOrNull() { val retrieveSpec = mockk() - every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.empty() + every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.empty() assertThat(retrieveSpec.retrieveAndAwaitOrNull()).isNull() } @Test suspend fun retrieveFlow() { val retrieveSpec = mockk() - every { retrieveSpec.retrieveFlux(match>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar") + every { retrieveSpec.retrieveFlux(match>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar") assertThat(retrieveSpec.retrieveFlow().toList()).contains("foo", "bar") } @Test fun retrieveMono() { val retrieveSpec = mockk() - every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.just("foo") + every { retrieveSpec.retrieveMono(match>(stringTypeRefMatcher)) } returns Mono.just("foo") assertThat(retrieveSpec.retrieveMono().block()).isEqualTo("foo") } @Test fun retrieveFlux() { val retrieveSpec = mockk() - every { retrieveSpec.retrieveFlux(match>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar") + every { retrieveSpec.retrieveFlux(match>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar") assertThat(retrieveSpec.retrieveFlux().collectList().block()).contains("foo", "bar") } } diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java index 05654d676fe..7a3b1e75e17 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java @@ -900,13 +900,13 @@ public interface WebTestClient { * List-specific assertions. * @param elementType the expected List element type */ - ListBodySpec expectBodyList(Class elementType); + ListBodySpec expectBodyList(Class elementType); /** * Alternative to {@link #expectBodyList(Class)} that accepts information * about a target type with generics. */ - ListBodySpec expectBodyList(ParameterizedTypeReference elementType); + ListBodySpec expectBodyList(ParameterizedTypeReference elementType); /** * Consume and decode the response body to {@code byte[]} and then apply diff --git a/spring-test/src/main/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensions.kt b/spring-test/src/main/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensions.kt index e6900204d91..24cf9c13125 100644 --- a/spring-test/src/main/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensions.kt +++ b/spring-test/src/main/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensions.kt @@ -75,7 +75,7 @@ inline fun ResponseSpec.expectBody(): BodySpec = * @author Sebastien Deleuze * @since 5.0 */ -inline fun ResponseSpec.expectBodyList(): ListBodySpec = +inline fun ResponseSpec.expectBodyList(): ListBodySpec = expectBodyList(object : ParameterizedTypeReference() {}) /** diff --git a/spring-test/src/test/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensionsTests.kt b/spring-test/src/test/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensionsTests.kt index 252ce31ca36..e7247f62c15 100644 --- a/spring-test/src/test/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensionsTests.kt +++ b/spring-test/src/test/kotlin/org/springframework/test/web/reactive/server/WebTestClientExtensionsTests.kt @@ -23,6 +23,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.reactivestreams.Publisher import org.springframework.core.ParameterizedTypeReference +import org.springframework.http.MediaType import org.springframework.web.reactive.function.server.router import java.util.concurrent.CompletableFuture @@ -95,6 +96,14 @@ class WebTestClientExtensionsTests { verify { responseSpec.expectBodyList(object : ParameterizedTypeReference() {}) } } + @Test + fun `ResponseSpec#expectBodyList with null value`() { + WebTestClient + .bindToRouterFunction( router { GET("/") { ok().contentType(MediaType.APPLICATION_JSON).bodyValue("[null]") } } ) + .build() + .get().uri("/").exchange().expectBodyList().hasSize(0) + } + @Test fun `ResponseSpec#returnResult with reified type parameters`() { responseSpec.returnResult()