mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-17 08:24:13 +00:00
Merge branch '7.0.x'
This commit is contained in:
@@ -42,7 +42,7 @@ import org.springframework.util.Assert;
|
||||
* @param <T> the referenced type
|
||||
* @see <a href="https://gafter.blogspot.nl/2006/12/super-type-tokens.html">Neal Gafter on Super Type Tokens</a>
|
||||
*/
|
||||
public abstract class ParameterizedTypeReference<T> {
|
||||
public abstract class ParameterizedTypeReference<T extends @Nullable Object> {
|
||||
|
||||
private final Type type;
|
||||
|
||||
|
||||
+5
-5
@@ -107,35 +107,35 @@ class RSocketRequesterExtensionsTests {
|
||||
suspend fun retrieveAndAwait() {
|
||||
val response = "foo"
|
||||
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.just("foo")
|
||||
assertThat(retrieveSpec.retrieveAndAwait<String>()).isEqualTo(response)
|
||||
}
|
||||
|
||||
@Test
|
||||
suspend fun retrieveAndAwaitOrNull() {
|
||||
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.empty()
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.empty()
|
||||
assertThat(retrieveSpec.retrieveAndAwaitOrNull<String>()).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
suspend fun retrieveFlow() {
|
||||
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
|
||||
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
|
||||
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
|
||||
assertThat(retrieveSpec.retrieveFlow<String>().toList()).contains("foo", "bar")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun retrieveMono() {
|
||||
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
|
||||
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.just("foo")
|
||||
assertThat(retrieveSpec.retrieveMono<String>().block()).isEqualTo("foo")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun retrieveFlux() {
|
||||
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
|
||||
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
|
||||
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
|
||||
assertThat(retrieveSpec.retrieveFlux<String>().collectList().block()).contains("foo", "bar")
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -900,13 +900,13 @@ public interface WebTestClient {
|
||||
* List-specific assertions.
|
||||
* @param elementType the expected List element type
|
||||
*/
|
||||
<E> ListBodySpec<E> expectBodyList(Class<E> elementType);
|
||||
<E extends @Nullable Object> ListBodySpec<E> expectBodyList(Class<E> elementType);
|
||||
|
||||
/**
|
||||
* Alternative to {@link #expectBodyList(Class)} that accepts information
|
||||
* about a target type with generics.
|
||||
*/
|
||||
<E> ListBodySpec<E> expectBodyList(ParameterizedTypeReference<E> elementType);
|
||||
<E extends @Nullable Object> ListBodySpec<E> expectBodyList(ParameterizedTypeReference<E> elementType);
|
||||
|
||||
/**
|
||||
* Consume and decode the response body to {@code byte[]} and then apply
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ inline fun <reified B : Any> ResponseSpec.expectBody(): BodySpec<B, *> =
|
||||
* @author Sebastien Deleuze
|
||||
* @since 5.0
|
||||
*/
|
||||
inline fun <reified E : Any> ResponseSpec.expectBodyList(): ListBodySpec<E> =
|
||||
inline fun <reified E : Any?> ResponseSpec.expectBodyList(): ListBodySpec<E> =
|
||||
expectBodyList(object : ParameterizedTypeReference<E>() {})
|
||||
|
||||
/**
|
||||
|
||||
+9
@@ -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<Foo>() {}) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ResponseSpec#expectBodyList with null value`() {
|
||||
WebTestClient
|
||||
.bindToRouterFunction( router { GET("/") { ok().contentType(MediaType.APPLICATION_JSON).bodyValue("[null]") } } )
|
||||
.build()
|
||||
.get().uri("/").exchange().expectBodyList<Foo?>().hasSize(0)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ResponseSpec#returnResult with reified type parameters`() {
|
||||
responseSpec.returnResult<Foo>()
|
||||
|
||||
Reference in New Issue
Block a user