Refactor tests with ScriptedSubscriber

Reactor recently added the `ScriptedSubscriber` in its new
`reactor-addons` module. This `Subscriber` revissits the previous
`TestSubscriber` with many improvements, including:

* scripting each expectation
* builder API that guides you until the final verification step
* virtual time support

This commit refactor all existing tests to use this new
infrastructure and removed the `TestSubscriber` implementation.

Issue: SPR-14800
This commit is contained in:
Brian Clozel
2016-10-18 09:06:33 +02:00
parent 827bc78e34
commit 99a3210859
50 changed files with 873 additions and 1911 deletions

View File

@@ -28,6 +28,7 @@ import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.codec.ByteBufferDecoder;
import org.springframework.core.codec.StringDecoder;
@@ -39,7 +40,7 @@ import org.springframework.http.ReactiveHttpInputMessage;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.tests.TestSubscriber;
import org.springframework.web.server.UnsupportedMediaTypeStatusException;
/**
* @author Arjen Poutsma
@@ -79,9 +80,10 @@ public class BodyExtractorsTests {
Mono<String> result = extractor.extract(request, this.context);
TestSubscriber.subscribe(result)
.assertComplete()
.assertValues("foo");
ScriptedSubscriber.<String>create()
.expectNext("foo")
.expectComplete()
.verify(result);
}
@Test
@@ -97,9 +99,11 @@ public class BodyExtractorsTests {
request.setBody(body);
Flux<String> result = extractor.extract(request, this.context);
TestSubscriber.subscribe(result)
.assertComplete()
.assertValues("foo");
ScriptedSubscriber.<String>create()
.expectNext("foo")
.expectComplete()
.verify(result);
}
@Test
@@ -123,8 +127,9 @@ public class BodyExtractorsTests {
};
Flux<String> result = extractor.extract(request, emptyContext);
TestSubscriber.subscribe(result)
.assertError(UnsupportedMediaTypeException.class);
ScriptedSubscriber.create()
.expectError(UnsupportedMediaTypeException.class)
.verify(result);
}
}

View File

@@ -27,6 +27,7 @@ import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.codec.ByteBufferEncoder;
import org.springframework.core.codec.CharSequenceEncoder;
@@ -39,7 +40,6 @@ import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertArrayEquals;
@@ -79,14 +79,14 @@ public class BodyInsertersTests {
MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = inserter.insert(response, this.context);
TestSubscriber.subscribe(result)
.assertComplete();
ScriptedSubscriber.create().expectComplete().verify(result);
ByteBuffer byteBuffer = ByteBuffer.wrap(body.getBytes(UTF_8));
DataBuffer buffer = new DefaultDataBufferFactory().wrap(byteBuffer);
TestSubscriber.subscribe(response.getBody())
.assertComplete()
.assertValues(buffer);
ScriptedSubscriber.<DataBuffer>create()
.expectNext(buffer)
.expectComplete()
.verify(response.getBody());
}
@Test
@@ -98,14 +98,14 @@ public class BodyInsertersTests {
MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = inserter.insert(response, this.context);
TestSubscriber.subscribe(result)
.assertComplete();
ScriptedSubscriber.create().expectComplete().verify(result);
ByteBuffer byteBuffer = ByteBuffer.wrap("foo".getBytes(UTF_8));
DataBuffer buffer = new DefaultDataBufferFactory().wrap(byteBuffer);
TestSubscriber.subscribe(response.getBody())
.assertComplete()
.assertValues(buffer);
ScriptedSubscriber.<DataBuffer>create()
.expectNext(buffer)
.expectComplete()
.verify(response.getBody());
}
@Test
@@ -117,18 +117,18 @@ public class BodyInsertersTests {
MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = inserter.insert(response, this.context);
TestSubscriber.subscribe(result)
.assertComplete();
ScriptedSubscriber.create().expectComplete().verify(result);
byte[] expectedBytes = Files.readAllBytes(body.getFile().toPath());
TestSubscriber.subscribe(response.getBody())
.assertComplete()
.assertValuesWith(dataBuffer -> {
ScriptedSubscriber.<DataBuffer>create()
.consumeNextWith(dataBuffer -> {
byte[] resultBytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(resultBytes);
assertArrayEquals(expectedBytes, resultBytes);
});
})
.expectComplete()
.verify(response.getBody());
}
@Test
@@ -142,9 +142,7 @@ public class BodyInsertersTests {
MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = inserter.insert(response, this.context);
TestSubscriber.subscribe(result)
.assertComplete();
ScriptedSubscriber.create().expectNextCount(0).expectComplete().verify(result);
}
@Test
@@ -157,9 +155,7 @@ public class BodyInsertersTests {
MockServerHttpResponse response = new MockServerHttpResponse();
Mono<Void> result = inserter.insert(response, this.context);
TestSubscriber.subscribe(result)
.assertComplete();
ScriptedSubscriber.create().expectNextCount(0).expectComplete().verify(result);
}
}

View File

@@ -15,26 +15,25 @@
*/
package org.springframework.http.codec;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.ByteBufferEncoder;
import org.springframework.core.codec.Encoder;
import org.springframework.http.MediaType;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import org.springframework.util.MimeTypeUtils;
import static java.nio.charset.StandardCharsets.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/**
* Unit tests for {@link EncoderHttpMessageWriter}.
*
@@ -69,7 +68,10 @@ public class EncoderHttpMessageWriterTest {
MediaType.APPLICATION_OCTET_STREAM, this.response, Collections.emptyMap());
assertThat(this.response.getHeaders().getContentType(), is(MediaType.APPLICATION_OCTET_STREAM));
TestSubscriber.subscribe(this.response.getBodyAsString()).assertComplete().assertValues(payload);
ScriptedSubscriber.<String>create()
.expectNext(payload)
.expectComplete()
.verify(this.response.getBodyAsString());
}
@NotNull

View File

@@ -22,6 +22,7 @@ import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.ByteArrayResource;
@@ -32,7 +33,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import org.springframework.util.MimeTypeUtils;
import static org.hamcrest.Matchers.*;
@@ -69,23 +69,38 @@ public class ResourceHttpMessageWriterTests {
@Test
public void shouldWriteResource() throws Exception {
TestSubscriber.subscribe(this.writer.write(Mono.just(resource), null, ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap())).assertComplete();
Mono<Void> mono = this.writer.write(Mono.just(resource), null,
ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap());
ScriptedSubscriber
.<Void>create()
.expectNextCount(0)
.expectComplete()
.verify(mono);
assertThat(this.response.getHeaders().getContentType(), is(MediaType.TEXT_PLAIN));
assertThat(this.response.getHeaders().getContentLength(), is(39L));
assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES), is("bytes"));
Mono<String> result = this.response.getBodyAsString();
TestSubscriber.subscribe(result).assertComplete().assertValues("Spring Framework test resource content.");
ScriptedSubscriber
.<String>create()
.expectNext("Spring Framework test resource content.")
.expectComplete()
.verify(result);
}
@Test
public void shouldWriteResourceRange() throws Exception {
this.request.getHeaders().setRange(Collections.singletonList(HttpRange.createByteRange(0, 5)));
TestSubscriber.subscribe(this.writer.write(Mono.just(resource), null, ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap())).assertComplete();
Mono<Void> mono = this.writer.write(Mono.just(resource), null, ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap());
ScriptedSubscriber
.<Void>create()
.expectNextCount(0)
.expectComplete()
.verify(mono);
assertThat(this.response.getHeaders().getContentType(), is(MediaType.TEXT_PLAIN));
assertThat(this.response.getHeaders().getFirst(HttpHeaders.CONTENT_RANGE), is("bytes 0-5/39"));
@@ -93,15 +108,24 @@ public class ResourceHttpMessageWriterTests {
assertThat(this.response.getHeaders().getContentLength(), is(6L));
Mono<String> result = this.response.getBodyAsString();
TestSubscriber.subscribe(result).assertComplete().assertValues("Spring");
ScriptedSubscriber
.<String>create()
.expectNext("Spring")
.expectComplete()
.verify(result);
}
@Test
public void shouldSetRangeNotSatisfiableStatus() throws Exception {
this.request.getHeaders().set(HttpHeaders.RANGE, "invalid");
TestSubscriber.subscribe(this.writer.write(Mono.just(resource), null, ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap()));
Mono<Void> mono = this.writer.write(Mono.just(resource), null, ResolvableType.forClass(Resource.class),
MediaType.TEXT_PLAIN, this.request, this.response, Collections.emptyMap());
ScriptedSubscriber
.<Void>create()
.expectNextCount(0)
.expectComplete()
.verify(mono);
assertThat(this.response.getHeaders().getFirst(HttpHeaders.ACCEPT_RANGES), is("bytes"));
assertThat(this.response.getStatusCode(), is(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE));

View File

@@ -16,8 +16,6 @@
package org.springframework.http.codec;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
@@ -30,6 +28,7 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.ByteArrayResource;
@@ -38,10 +37,12 @@ import org.springframework.core.io.support.ResourceRegion;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import org.springframework.util.MimeTypeUtils;
import org.springframework.util.StringUtils;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/**
* Unit tests for {@link ResourceRegionHttpMessageWriter}.
* @author Brian Clozel
@@ -82,15 +83,16 @@ public class ResourceRegionHttpMessageWriterTests {
ResourceRegion region = new ResourceRegion(this.resource, 0, 6);
TestSubscriber.subscribe(this.writer.write(Mono.just(region), ResolvableType.forClass(ResourceRegion.class),
MediaType.TEXT_PLAIN, this.response, Collections.emptyMap())).assertComplete();
Mono<Void> mono = this.writer.write(Mono.just(region), ResolvableType.forClass(ResourceRegion.class),
MediaType.TEXT_PLAIN, this.response, Collections.emptyMap());
ScriptedSubscriber.<Void>create().expectComplete().verify(mono);
assertThat(this.response.getHeaders().getContentType(), is(MediaType.TEXT_PLAIN));
assertThat(this.response.getHeaders().getFirst(HttpHeaders.CONTENT_RANGE), is("bytes 0-5/39"));
assertThat(this.response.getHeaders().getContentLength(), is(6L));
Mono<String> result = response.getBodyAsString();
TestSubscriber.subscribe(result).assertComplete().assertValues("Spring");
ScriptedSubscriber.<String>create().expectNext("Spring").expectComplete().verify(result);
}
@Test
@@ -105,43 +107,43 @@ public class ResourceRegionHttpMessageWriterTests {
Map<String, Object> hints = new HashMap<>(1);
hints.put(ResourceRegionHttpMessageWriter.BOUNDARY_STRING_HINT, boundary);
TestSubscriber.subscribe(
this.writer.write(regions, ResolvableType.forClass(ResourceRegion.class),
MediaType.TEXT_PLAIN, this.response, hints))
.assertComplete();
Mono<Void> mono = this.writer.write(regions, ResolvableType.forClass(ResourceRegion.class),
MediaType.TEXT_PLAIN, this.response, hints);
ScriptedSubscriber.<Void>create().expectComplete().verify(mono);
HttpHeaders headers = this.response.getHeaders();
assertThat(headers.getContentType().toString(), startsWith("multipart/byteranges;boundary=" + boundary));
Mono<String> result = response.getBodyAsString();
TestSubscriber
.subscribe(result).assertNoError()
.assertComplete()
.assertValuesWith(content -> {
String[] ranges = StringUtils.tokenizeToStringArray(content, "\r\n", false, true);
assertThat(ranges[0], is("--" + boundary));
assertThat(ranges[1], is("Content-Type: text/plain"));
assertThat(ranges[2], is("Content-Range: bytes 0-5/39"));
assertThat(ranges[3], is("Spring"));
assertThat(ranges[4], is("--" + boundary));
assertThat(ranges[5], is("Content-Type: text/plain"));
assertThat(ranges[6], is("Content-Range: bytes 7-15/39"));
assertThat(ranges[7], is("Framework"));
assertThat(ranges[8], is("--" + boundary));
assertThat(ranges[9], is("Content-Type: text/plain"));
assertThat(ranges[10], is("Content-Range: bytes 17-20/39"));
assertThat(ranges[11], is("test"));
assertThat(ranges[12], is("--" + boundary));
assertThat(ranges[13], is("Content-Type: text/plain"));
assertThat(ranges[14], is("Content-Range: bytes 22-38/39"));
assertThat(ranges[15], is("resource content."));
assertThat(ranges[16], is("--" + boundary + "--"));
});
ScriptedSubscriber
.<String>create()
.consumeNextWith(content -> {
String[] ranges = StringUtils
.tokenizeToStringArray(content, "\r\n", false, true);
String[] expected = new String[] {
"--" + boundary,
"Content-Type: text/plain",
"Content-Range: bytes 0-5/39",
"Spring",
"--" + boundary,
"Content-Type: text/plain",
"Content-Range: bytes 7-15/39",
"Framework",
"--" + boundary,
"Content-Type: text/plain",
"Content-Range: bytes 17-20/39",
"test",
"--" + boundary,
"Content-Type: text/plain",
"Content-Range: bytes 22-38/39",
"resource content.",
"--" + boundary + "--"
};
assertArrayEquals(expected, ranges);
})
.expectComplete()
.verify(result);
}
}

View File

@@ -18,11 +18,13 @@ package org.springframework.http.codec;
import java.time.Duration;
import java.util.Collections;
import java.util.function.Consumer;
import org.junit.Test;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
@@ -30,7 +32,6 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -71,17 +72,13 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
messageWriter.write(source, ResolvableType.forClass(ServerSentEvent.class),
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
Publisher<Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
TestSubscriber.subscribe(result).
assertNoError().
assertValuesWith(publisher -> {
TestSubscriber.subscribe(publisher).assertNoError().assertValuesWith(
stringConsumer("id:c42\n" + "event:foo\n" + "retry:123\n" +
":bla\n:bla bla\n:bla bla bla\n" +
"data:bar\n"),
stringConsumer("\n"));
});
Publisher<Publisher<DataBuffer>> result = Flux.from(outputMessage.getBodyWithFlush());
ScriptedSubscriber
.<Publisher<DataBuffer>>create()
.consumeNextWith(sseConsumer("id:c42\n" + "event:foo\n" + "retry:123\n" +
":bla\n:bla bla\n:bla bla bla\n" + "data:bar\n"))
.expectComplete()
.verify(result);
}
@Test
@@ -92,19 +89,12 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
Publisher<Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
TestSubscriber.subscribe(result).
assertNoError().
assertValuesWith(publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:foo\n"),
stringConsumer("\n"));
}, publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:bar\n"),
stringConsumer("\n"));
});
ScriptedSubscriber
.<Publisher<DataBuffer>>create()
.consumeNextWith(sseConsumer("data:foo\n"))
.consumeNextWith(sseConsumer("data:bar\n"))
.expectComplete()
.verify(result);
}
@Test
@@ -115,19 +105,12 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
Publisher<Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
TestSubscriber.subscribe(result).
assertNoError().
assertValuesWith(publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:foo\ndata:bar\n"),
stringConsumer("\n"));
}, publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:foo\ndata:baz\n"),
stringConsumer("\n"));
});
ScriptedSubscriber
.<Publisher<DataBuffer>>create()
.consumeNextWith(sseConsumer("data:foo\ndata:bar\n"))
.consumeNextWith(sseConsumer("data:foo\ndata:baz\n"))
.expectComplete()
.verify(result);
}
@Test
@@ -139,21 +122,22 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
Publisher<Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
TestSubscriber.subscribe(result).
assertNoError().
assertValuesWith(publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:"), stringConsumer(
"{\"foo\":\"foofoo\",\"bar\":\"barbar\"}"),
stringConsumer("\n"), stringConsumer("\n"));
ScriptedSubscriber
.<Publisher<DataBuffer>>create()
.consumeNextWith(sseConsumer("data:", "{\"foo\":\"foofoo\",\"bar\":\"barbar\"}", "\n"))
.consumeNextWith(sseConsumer("data:", "{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}", "\n"))
.expectComplete()
.verify(result);
}
}, publisher -> {
TestSubscriber.subscribe(publisher).assertNoError()
.assertValuesWith(stringConsumer("data:"), stringConsumer(
"{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}"),
stringConsumer("\n"), stringConsumer("\n"));
});
private Consumer<Publisher<DataBuffer>> sseConsumer(String... expected) {
return publisher -> {
ScriptedSubscriber.StepBuilder<DataBuffer> builder = ScriptedSubscriber.create();
for (String value : expected) {
builder = builder.consumeNextWith(stringConsumer(value));
}
builder.consumeNextWith(stringConsumer("\n")).expectComplete().verify(publisher);
};
}
}

View File

@@ -25,15 +25,17 @@ import com.fasterxml.jackson.annotation.JsonView;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.codec.Pojo;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Unit tests for {@link Jackson2JsonDecoder}.
@@ -53,18 +55,20 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
}
@Test
public void decodePojo() {
public void decodePojo() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}"));
ResolvableType elementType = ResolvableType.forClass(Pojo.class);
Flux<Object> flux = new Jackson2JsonDecoder().decode(source, elementType, null,
Collections.emptyMap());
TestSubscriber.subscribe(flux).assertNoError().assertComplete().
assertValues(new Pojo("foofoo", "barbar"));
ScriptedSubscriber.<Object>create()
.expectNext(new Pojo("foofoo", "barbar"))
.expectComplete()
.verify(flux);
}
@Test
public void decodeToList() {
public void decodeToList() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer(
"[{\"bar\":\"b1\",\"foo\":\"f1\"},{\"bar\":\"b2\",\"foo\":\"f2\"}]"));
@@ -72,12 +76,14 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
Mono<Object> mono = new Jackson2JsonDecoder().decodeToMono(source, elementType,
null, Collections.emptyMap());
TestSubscriber.subscribe(mono).assertNoError().assertComplete().
assertValues(Arrays.asList(new Pojo("f1", "b1"), new Pojo("f2", "b2")));
ScriptedSubscriber.<Object>create()
.expectNext(Arrays.asList(new Pojo("f1", "b1"), new Pojo("f2", "b2")))
.expectComplete()
.verify(mono);
}
@Test
public void decodeToFlux() {
public void decodeToFlux() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer(
"[{\"bar\":\"b1\",\"foo\":\"f1\"},{\"bar\":\"b2\",\"foo\":\"f2\"}]"));
@@ -85,41 +91,43 @@ public class Jackson2JsonDecoderTests extends AbstractDataBufferAllocatingTestCa
Flux<Object> flux = new Jackson2JsonDecoder().decode(source, elementType, null,
Collections.emptyMap());
TestSubscriber.subscribe(flux).assertNoError().assertComplete().
assertValues(new Pojo("f1", "b1"), new Pojo("f2", "b2"));
ScriptedSubscriber.<Object>create()
.expectNext(new Pojo("f1", "b1"))
.expectNext(new Pojo("f2", "b2"))
.expectComplete()
.verify(flux);
}
@Test
public void jsonView() {
public void jsonView() throws Exception {
Flux<DataBuffer> source = Flux.just(
stringBuffer("{\"withView1\" : \"with\", \"withView2\" : \"with\", \"withoutView\" : \"without\"}"));
ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class);
ResolvableType elementType = ResolvableType.forClass(JacksonViewBean.class);
Map<String, Object> hints = Collections.singletonMap(Jackson2JsonDecoder.JSON_VIEW_HINT, MyJacksonView1.class);
Flux<JacksonViewBean> flux = new Jackson2JsonDecoder()
.decode(source, elementType, null, hints).cast(JacksonViewBean.class);
TestSubscriber
.subscribe(flux)
.assertNoError()
.assertComplete()
.assertValuesWith(b -> {
ScriptedSubscriber.<JacksonViewBean>create()
.consumeNextWith(b -> {
assertTrue(b.getWithView1().equals("with"));
assertNull(b.getWithView2());
assertNull(b.getWithoutView());
});
})
.expectComplete()
.verify(flux);
}
@Test
public void decodeEmptyBodyToMono() {
public void decodeEmptyBodyToMono() throws Exception {
Flux<DataBuffer> source = Flux.empty();
ResolvableType elementType = ResolvableType.forClass(Pojo.class);
Mono<Object> flux = new Jackson2JsonDecoder().decodeToMono(source, elementType,
Mono<Object> mono = new Jackson2JsonDecoder().decodeToMono(source, elementType,
null, Collections.emptyMap());
TestSubscriber.subscribe(flux)
.assertNoError()
.assertComplete()
.assertValueCount(0);
ScriptedSubscriber.
<Object>create().expectNextCount(0)
.expectComplete()
.verify(mono);
}

View File

@@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonView;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
@@ -32,9 +33,9 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.codec.Pojo;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Sebastien Deleuze
@@ -55,7 +56,7 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa
}
@Test
public void encode() {
public void encode() throws Exception {
Flux<Pojo> source = Flux.just(
new Pojo("foo", "bar"),
new Pojo("foofoo", "barbar"),
@@ -64,51 +65,52 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa
ResolvableType type = ResolvableType.forClass(Pojo.class);
Flux<DataBuffer> output = this.encoder.encode(source, this.bufferFactory, type, null, Collections.emptyMap());
TestSubscriber.subscribe(output)
.assertComplete()
.assertNoError()
.assertValuesWith(
stringConsumer("["),
stringConsumer("{\"foo\":\"foo\",\"bar\":\"bar\"}"),
stringConsumer(","),
stringConsumer("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}"),
stringConsumer(","),
stringConsumer("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}"),
stringConsumer("]")
);
ScriptedSubscriber
.<DataBuffer>create()
.consumeNextWith(stringConsumer("["))
.consumeNextWith(stringConsumer("{\"foo\":\"foo\",\"bar\":\"bar\"}"))
.consumeNextWith(stringConsumer(","))
.consumeNextWith(stringConsumer("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}"))
.consumeNextWith(stringConsumer(","))
.consumeNextWith(stringConsumer("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}"))
.consumeNextWith(stringConsumer("]"))
.expectComplete()
.verify(output);
}
@Test
public void encodeWithType() {
public void encodeWithType() throws Exception {
Flux<ParentClass> source = Flux.just(new Foo(), new Bar());
ResolvableType type = ResolvableType.forClass(ParentClass.class);
Flux<DataBuffer> output = this.encoder.encode(source, this.bufferFactory, type, null, Collections.emptyMap());
TestSubscriber.subscribe(output)
.assertComplete()
.assertNoError()
.assertValuesWith(stringConsumer("["),
stringConsumer("{\"type\":\"foo\"}"),
stringConsumer(","),
stringConsumer("{\"type\":\"bar\"}"),
stringConsumer("]"));
ScriptedSubscriber
.<DataBuffer>create()
.consumeNextWith(stringConsumer("["))
.consumeNextWith(stringConsumer("{\"type\":\"foo\"}"))
.consumeNextWith(stringConsumer(","))
.consumeNextWith(stringConsumer("{\"type\":\"bar\"}"))
.consumeNextWith(stringConsumer("]"))
.expectComplete()
.verify(output);
}
@Test
public void jsonView() {
public void jsonView() throws Exception {
JacksonViewBean bean = new JacksonViewBean();
bean.setWithView1("with");
bean.setWithView2("with");
bean.setWithoutView("without");
ResolvableType type = ResolvableType.forClass(JacksonViewBean.class);
ResolvableType type = ResolvableType.forClass(JacksonViewBean.class);
Map<String, Object> hints = Collections.singletonMap(Jackson2JsonEncoder.JSON_VIEW_HINT, MyJacksonView1.class);
Flux<DataBuffer> output = this.encoder.encode(Mono.just(bean), this.bufferFactory, type, null, hints);
TestSubscriber.subscribe(output)
.assertComplete()
.assertNoError()
.assertValuesWith(stringConsumer("{\"withView1\":\"with\"}"));
ScriptedSubscriber
.<DataBuffer>create()
.consumeNextWith(stringConsumer("{\"withView1\":\"with\"}"))
.expectComplete()
.verify(output);
}

View File

@@ -21,10 +21,10 @@ import java.util.Collections;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.tests.TestSubscriber;
/**
* @author Sebastien Deleuze
@@ -32,15 +32,16 @@ import org.springframework.tests.TestSubscriber;
public class JsonObjectDecoderTests extends AbstractDataBufferAllocatingTestCase {
@Test
public void decodeSingleChunkToJsonObject() {
public void decodeSingleChunkToJsonObject() throws Exception {
JsonObjectDecoder decoder = new JsonObjectDecoder();
Flux<DataBuffer> source =
Flux.just(stringBuffer("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}"));
Flux<String> output =
decoder.decode(source, null, null, Collections.emptyMap()).map(JsonObjectDecoderTests::toString);
TestSubscriber
.subscribe(output)
.assertValues("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}");
ScriptedSubscriber.<String>create()
.expectNext("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}")
.expectComplete()
.verify(output);
}
@Test
@@ -50,9 +51,10 @@ public class JsonObjectDecoderTests extends AbstractDataBufferAllocatingTestCase
stringBuffer(", \"bar\": \"barbar\"}"));
Flux<String> output =
decoder.decode(source, null, null, Collections.emptyMap()).map(JsonObjectDecoderTests::toString);
TestSubscriber
.subscribe(output)
.assertValues("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}");
ScriptedSubscriber.<String>create()
.expectNext("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}")
.expectComplete()
.verify(output);
}
@Test
@@ -62,10 +64,11 @@ public class JsonObjectDecoderTests extends AbstractDataBufferAllocatingTestCase
"[{\"foo\": \"foofoo\", \"bar\": \"barbar\"},{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}]"));
Flux<String> output =
decoder.decode(source, null, null, Collections.emptyMap()).map(JsonObjectDecoderTests::toString);
TestSubscriber
.subscribe(output)
.assertValues("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}",
"{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}");
ScriptedSubscriber.<String>create()
.expectNext("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}")
.expectNext("{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}")
.expectComplete()
.verify(output);
}
@Test
@@ -76,10 +79,11 @@ public class JsonObjectDecoderTests extends AbstractDataBufferAllocatingTestCase
": \"barbar\"},{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}]"));
Flux<String> output =
decoder.decode(source, null, null, Collections.emptyMap()).map(JsonObjectDecoderTests::toString);
TestSubscriber
.subscribe(output)
.assertValues("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}",
"{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}");
ScriptedSubscriber.<String>create()
.expectNext("{\"foo\": \"foofoo\", \"bar\": \"barbar\"}")
.expectNext("{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}")
.expectComplete()
.verify(output);
}

View File

@@ -23,6 +23,7 @@ import javax.xml.stream.events.XMLEvent;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
@@ -35,9 +36,10 @@ import org.springframework.http.codec.xml.jaxb.XmlRootElementWithNameAndNamespac
import org.springframework.http.codec.xml.jaxb.XmlType;
import org.springframework.http.codec.xml.jaxb.XmlTypeWithName;
import org.springframework.http.codec.xml.jaxb.XmlTypeWithNameAndNamespace;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Sebastien Deleuze
@@ -89,11 +91,8 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
.decode(Flux.just(stringBuffer(POJO_ROOT)), null, null, Collections.emptyMap());
Flux<List<XMLEvent>> result = this.decoder.split(xmlEvents, new QName("pojo"));
TestSubscriber
.subscribe(result)
.assertNoError()
.assertComplete()
.assertValuesWith(events -> {
ScriptedSubscriber.<List<XMLEvent>>create()
.consumeNextWith(events -> {
assertEquals(8, events.size());
assertStartElement(events.get(0), "pojo");
assertStartElement(events.get(1), "foo");
@@ -103,22 +102,20 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
assertCharacters(events.get(5), "barbar");
assertEndElement(events.get(6), "bar");
assertEndElement(events.get(7), "pojo");
});
})
.expectComplete()
.verify(result);
}
@Test
public void splitMultipleBranches() {
public void splitMultipleBranches() throws Exception {
Flux<XMLEvent> xmlEvents = this.xmlEventDecoder
.decode(Flux.just(stringBuffer(POJO_CHILD)), null, null, Collections.emptyMap());
Flux<List<XMLEvent>> result = this.decoder.split(xmlEvents, new QName("pojo"));
TestSubscriber
.subscribe(result)
.assertNoError()
.assertComplete()
.assertValuesWith(events -> {
ScriptedSubscriber.<List<XMLEvent>>create()
.consumeNextWith(events -> {
assertEquals(8, events.size());
assertStartElement(events.get(0), "pojo");
assertStartElement(events.get(1), "foo");
@@ -128,7 +125,8 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
assertCharacters(events.get(5), "bar");
assertEndElement(events.get(6), "bar");
assertEndElement(events.get(7), "pojo");
}, events -> {
})
.consumeNextWith(events -> {
assertEquals(8, events.size());
assertStartElement(events.get(0), "pojo");
assertStartElement(events.get(1), "foo");
@@ -138,7 +136,9 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
assertCharacters(events.get(5), "barbar");
assertEndElement(events.get(6), "bar");
assertEndElement(events.get(7), "pojo");
});
})
.expectComplete()
.verify(result);
}
private static void assertStartElement(XMLEvent event, String expectedLocalName) {
@@ -162,11 +162,10 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(Pojo.class),
null, Collections.emptyMap());
TestSubscriber
.subscribe(output)
.assertNoError()
.assertComplete()
.assertValues(new Pojo("foofoo", "barbar"));
ScriptedSubscriber.<Object>create()
.expectNext(new Pojo("foofoo", "barbar"))
.expectComplete()
.verify(output);
}
@Test
@@ -175,11 +174,10 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(TypePojo.class),
null, Collections.emptyMap());
TestSubscriber
.subscribe(output)
.assertNoError()
.assertComplete()
.assertValues(new TypePojo("foofoo", "barbar"));
ScriptedSubscriber.<Object>create()
.expectNext(new TypePojo("foofoo", "barbar"))
.expectComplete()
.verify(output);
}
@Test
@@ -188,11 +186,11 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(Pojo.class),
null, Collections.emptyMap());
TestSubscriber
.subscribe(output)
.assertNoError()
.assertComplete()
.assertValues(new Pojo("foo", "bar"), new Pojo("foofoo", "barbar"));
ScriptedSubscriber.<Object>create()
.expectNext(new Pojo("foo", "bar"))
.expectNext(new Pojo("foofoo", "barbar"))
.expectComplete()
.verify(output);
}
@Test
@@ -201,11 +199,11 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(TypePojo.class),
null, Collections.emptyMap());
TestSubscriber
.subscribe(output)
.assertNoError()
.assertComplete()
.assertValues(new TypePojo("foo", "bar"), new TypePojo("foofoo", "barbar"));
ScriptedSubscriber.<Object>create()
.expectNext(new TypePojo("foo", "bar"))
.expectNext(new TypePojo("foofoo", "barbar"))
.expectComplete()
.verify(output);
}
@Test

View File

@@ -21,6 +21,7 @@ import java.util.Collections;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
@@ -29,10 +30,11 @@ import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.support.DataBufferTestUtils;
import org.springframework.http.MediaType;
import org.springframework.http.codec.Pojo;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.*;
import static org.xmlunit.matchers.CompareMatcher.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.xmlunit.matchers.CompareMatcher.isSimilarTo;
/**
* @author Sebastien Deleuze
@@ -61,24 +63,27 @@ public class Jaxb2XmlEncoderTests extends AbstractDataBufferAllocatingTestCase {
}
@Test
public void encode() {
public void encode() throws Exception {
Flux<Pojo> source = Flux.just(new Pojo("foofoo", "barbar"), new Pojo("foofoofoo", "barbarbar"));
Flux<DataBuffer> output = this.encoder.encode(source, this.bufferFactory,
ResolvableType.forClass(Pojo.class),
MediaType.APPLICATION_XML, Collections.emptyMap());
TestSubscriber
.subscribe(output)
.assertValuesWith(dataBuffer -> {
try {
String s = DataBufferTestUtils
.dumpString(dataBuffer, StandardCharsets.UTF_8);
assertThat(s, isSimilarTo("<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" +
"<pojo><bar>barbar</bar><foo>foofoo</foo></pojo>"));
}
finally {
DataBufferUtils.release(dataBuffer);
}
});
MediaType.APPLICATION_XML, Collections.emptyMap());
ScriptedSubscriber
.<DataBuffer>create()
.consumeNextWith(dataBuffer -> {
try {
String s = DataBufferTestUtils
.dumpString(dataBuffer, StandardCharsets.UTF_8);
assertThat(s, isSimilarTo("<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" +
"<pojo><bar>barbar</bar><foo>foofoo</foo></pojo>"));
}
finally {
DataBufferUtils.release(dataBuffer);
}
})
.expectComplete()
.verify(output);
}
}

View File

@@ -21,9 +21,9 @@ import javax.xml.stream.events.XMLEvent;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -47,19 +47,19 @@ public class XmlEventDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<XMLEvent> events =
this.decoder.decode(Flux.just(stringBuffer(XML)), null, null, Collections.emptyMap());
TestSubscriber
.subscribe(events)
.assertNoError()
.assertComplete()
.assertValuesWith(e -> assertTrue(e.isStartDocument()),
e -> assertStartElement(e, "pojo"),
e -> assertStartElement(e, "foo"),
e -> assertCharacters(e, "foofoo"),
e -> assertEndElement(e, "foo"),
e -> assertStartElement(e, "bar"),
e -> assertCharacters(e, "barbar"),
e -> assertEndElement(e, "bar"),
e -> assertEndElement(e, "pojo"));
ScriptedSubscriber
.<XMLEvent>create()
.consumeNextWith(e -> assertTrue(e.isStartDocument()))
.consumeNextWith(e -> assertStartElement(e, "pojo"))
.consumeNextWith(e -> assertStartElement(e, "foo"))
.consumeNextWith(e -> assertCharacters(e, "foofoo"))
.consumeNextWith(e -> assertEndElement(e, "foo"))
.consumeNextWith(e -> assertStartElement(e, "bar"))
.consumeNextWith(e -> assertCharacters(e, "barbar"))
.consumeNextWith(e -> assertEndElement(e, "bar"))
.consumeNextWith(e -> assertEndElement(e, "pojo"))
.expectComplete()
.verify(events);
}
@Test
@@ -69,19 +69,20 @@ public class XmlEventDecoderTests extends AbstractDataBufferAllocatingTestCase {
Flux<XMLEvent> events =
this.decoder.decode(Flux.just(stringBuffer(XML)), null, null, Collections.emptyMap());
TestSubscriber
.subscribe(events)
.assertNoError()
.assertComplete()
.assertValuesWith(e -> assertTrue(e.isStartDocument()),
e -> assertStartElement(e, "pojo"),
e -> assertStartElement(e, "foo"),
e -> assertCharacters(e, "foofoo"),
e -> assertEndElement(e, "foo"),
e -> assertStartElement(e, "bar"),
e -> assertCharacters(e, "barbar"),
e -> assertEndElement(e, "bar"), e -> assertEndElement(e, "pojo"),
e -> assertTrue(e.isEndDocument()));
ScriptedSubscriber
.<XMLEvent>create()
.consumeNextWith(e -> assertTrue(e.isStartDocument()))
.consumeNextWith(e -> assertStartElement(e, "pojo"))
.consumeNextWith(e -> assertStartElement(e, "foo"))
.consumeNextWith(e -> assertCharacters(e, "foofoo"))
.consumeNextWith(e -> assertEndElement(e, "foo"))
.consumeNextWith(e -> assertStartElement(e, "bar"))
.consumeNextWith(e -> assertCharacters(e, "barbar"))
.consumeNextWith(e -> assertEndElement(e, "bar"))
.consumeNextWith(e -> assertEndElement(e, "pojo"))
.consumeNextWith(e -> assertTrue(e.isEndDocument()))
.expectComplete()
.verify(events);
}
private static void assertStartElement(XMLEvent event, String expectedLocalName) {

View File

@@ -23,11 +23,11 @@ import org.junit.Test;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.http.codec.BodyExtractors;
import org.springframework.tests.TestSubscriber;
import org.springframework.web.client.reactive.ClientRequest;
import org.springframework.web.client.reactive.WebClient;
@@ -56,10 +56,10 @@ public class FlushingIntegrationTests extends AbstractHttpHandlerIntegrationTest
.takeUntil(s -> s.endsWith("data1"))
.reduce((s1, s2) -> s1 + s2);
TestSubscriber
.subscribe(result)
.await(Duration.ofSeconds(5))
.assertValues("data0data1");
ScriptedSubscriber.<String>create()
.expectNext("data0data1")
.expectComplete()
.verify(result, Duration.ofSeconds(5L));
}
@Override

View File

@@ -28,6 +28,7 @@ import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
@@ -36,7 +37,6 @@ import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.http.codec.BodyExtractors;
import org.springframework.http.codec.BodyInserters;
import org.springframework.http.codec.Pojo;
import org.springframework.tests.TestSubscriber;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
@@ -70,14 +70,14 @@ public class WebClientIntegrationTests {
.exchange(request)
.map(response -> response.headers().asHttpHeaders());
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValuesWith(
ScriptedSubscriber.<HttpHeaders>create()
.consumeNextWith(
httpHeaders -> {
assertEquals(MediaType.TEXT_PLAIN, httpHeaders.getContentType());
assertEquals(13L, httpHeaders.getContentLength());
})
.assertComplete();
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -98,10 +98,11 @@ public class WebClientIntegrationTests {
.exchange(request)
.then(response -> response.body(toMono(String.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValues("Hello Spring!")
.assertComplete();
ScriptedSubscriber
.<String>create()
.expectNext("Hello Spring!")
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -125,10 +126,11 @@ public class WebClientIntegrationTests {
.exchange(request)
.then(response -> response.body(toMono(String.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValues(content)
.assertComplete();
ScriptedSubscriber
.<String>create()
.expectNext(content)
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -150,10 +152,11 @@ public class WebClientIntegrationTests {
.exchange(request)
.then(response -> response.body(toMono(Pojo.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValuesWith(p -> assertEquals("barbar", p.getBar()))
.assertComplete();
ScriptedSubscriber
.<Pojo>create()
.consumeNextWith(p -> assertEquals("barbar", p.getBar()))
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -175,13 +178,12 @@ public class WebClientIntegrationTests {
.exchange(request)
.flatMap(response -> response.body(toFlux(Pojo.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValuesWith(
p -> assertThat(p.getBar(), Matchers.is("bar1")),
p -> assertThat(p.getBar(), Matchers.is("bar2")))
.assertValueCount(2)
.assertComplete();
ScriptedSubscriber
.<Pojo>create()
.consumeNextWith(p -> assertThat(p.getBar(), Matchers.is("bar1")))
.consumeNextWith(p -> assertThat(p.getBar(), Matchers.is("bar2")))
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -206,10 +208,11 @@ public class WebClientIntegrationTests {
.exchange(request)
.then(response -> response.body(BodyExtractors.toMono(Pojo.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValuesWith(p -> assertEquals("BARBAR", p.getBar()))
.assertComplete();
ScriptedSubscriber
.<Pojo>create()
.consumeNextWith(p -> assertEquals("BARBAR", p.getBar()))
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -234,10 +237,11 @@ public class WebClientIntegrationTests {
.exchange(request)
.then(response -> response.body(toMono(String.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValues("test")
.assertComplete();
ScriptedSubscriber
.<String>create()
.expectNext("test")
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -256,12 +260,13 @@ public class WebClientIntegrationTests {
Mono<ClientResponse> result = this.webClient
.exchange(request);
TestSubscriber
.subscribe(result)
.await(Duration.ofSeconds(3))
.assertValuesWith(response -> {
ScriptedSubscriber
.<ClientResponse>create()
.consumeNextWith(response -> {
assertEquals(HttpStatus.NOT_FOUND, response.statusCode());
});
})
.expectComplete()
.verify(result, Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -287,10 +292,11 @@ public class WebClientIntegrationTests {
Mono<String> result = filteredClient.exchange(request)
.then(response -> response.body(toMono(String.class)));
TestSubscriber
.subscribe(result)
.awaitAndAssertNextValues("Hello Spring!")
.assertComplete();
ScriptedSubscriber
.<String>create()
.expectNext("Hello Spring!")
.expectComplete()
.verify(result);
RecordedRequest recordedRequest = server.takeRequest();
assertEquals(1, server.getRequestCount());
@@ -302,4 +308,4 @@ public class WebClientIntegrationTests {
public void tearDown() throws Exception {
this.server.shutdown();
}
}
}

View File

@@ -21,12 +21,12 @@ import java.time.Duration;
import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Mono;
import reactor.test.subscriber.ScriptedSubscriber;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.tests.TestSubscriber;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
@@ -72,8 +72,10 @@ public class ResponseStatusExceptionHandlerTests {
Throwable expected = new IllegalStateException();
Mono<Void> mono = this.handler.handle(this.exchange, expected);
TestSubscriber.subscribe(mono)
.assertErrorWith(actual -> assertSame(expected, actual));
ScriptedSubscriber
.<Void>create()
.consumeErrorWith(actual -> assertSame(expected, actual))
.verify(mono);
}
}