From 117fc8a5acf5d25f6698ac38b0ed64dcd3c6ce3e Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sun, 12 Jan 2020 15:04:35 +0100 Subject: [PATCH] Further simplification: using the real WebClient with an ExchangeFunction --- .../juplo/demo/RemoteContentServiceTest.java | 21 +- .../java/de/juplo/demo/WebClientStub.java | 449 ------------------ 2 files changed, 18 insertions(+), 452 deletions(-) delete mode 100644 src/test/java/de/juplo/demo/WebClientStub.java diff --git a/src/test/java/de/juplo/demo/RemoteContentServiceTest.java b/src/test/java/de/juplo/demo/RemoteContentServiceTest.java index a396d6c..cf2f035 100644 --- a/src/test/java/de/juplo/demo/RemoteContentServiceTest.java +++ b/src/test/java/de/juplo/demo/RemoteContentServiceTest.java @@ -5,7 +5,12 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import static org.mockito.Mockito.when; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.ExchangeFunction; +import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -18,11 +23,21 @@ public class RemoteContentServiceTest { RemoteContentService service; + @MockBean + ExchangeFunction exchangeFunction; + @MockBean + ClientResponse clientResponse; + @BeforeEach void setUp() { - service = new RemoteContentService(WebClientStub.WEB_CLIENT); + service = + new RemoteContentService( + WebClient + .builder() + .exchangeFunction(request -> Mono.just(clientResponse)) + .build()); } @@ -30,10 +45,10 @@ public class RemoteContentServiceTest void test() { Mono mono = Mono.just("bar"); - WebClientStub.expect(mono); + when(clientResponse.bodyToMono(String.class)).thenReturn(mono); Mono result = service.getRemoteText("/foo"); - assertThat(result).isSameAs(mono); + assertThat(result.block()).isEqualTo("bar"); } } diff --git a/src/test/java/de/juplo/demo/WebClientStub.java b/src/test/java/de/juplo/demo/WebClientStub.java deleted file mode 100644 index 328029c..0000000 --- a/src/test/java/de/juplo/demo/WebClientStub.java +++ /dev/null @@ -1,449 +0,0 @@ -package de.juplo.demo; - - -import java.net.URI; -import java.nio.charset.Charset; -import java.time.ZonedDateTime; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.IntPredicate; -import java.util.function.Predicate; -import java.util.function.Supplier; -import org.reactivestreams.Publisher; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.http.client.reactive.ClientHttpRequest; -import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.BodyInserter; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.UriBuilder; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - - -/** - * A stub for {@link WebClient}, that can be used for mocking. - * @author Kai Moritz - */ -public class WebClientStub implements WebClient -{ - public final static WebClientStub WEB_CLIENT = new WebClientStub(); - public final static RequestHeadersUriSpecStub HEADERS_SPEC = new RequestHeadersUriSpecStub(); - public final static RequestBodySpecStub REQUEST_BODY_SPEC = new RequestBodySpecStub(); - public final static ResponseSpecStub RESPONSE_SPEC = new ResponseSpecStub(); - - private static Supplier> TO_MONO = () -> null; - private static Supplier> TO_FLUX = () -> null; - - - public static void expect(Mono mono) { TO_MONO = () -> mono; } - public static void expect(Flux flux) { TO_FLUX = () -> flux; } - - - private WebClientStub() {} - - - @Override - public WebClient.RequestHeadersUriSpec get() - { - return HEADERS_SPEC; - } - - @Override - public WebClient.RequestHeadersUriSpec head() - { - return HEADERS_SPEC; - } - - @Override - public WebClient.RequestBodyUriSpec post() - { - return REQUEST_BODY_SPEC; - } - - @Override - public WebClient.RequestBodyUriSpec put() - { - return REQUEST_BODY_SPEC; - } - - @Override - public WebClient.RequestBodyUriSpec patch() - { - return REQUEST_BODY_SPEC; - } - - @Override - public WebClient.RequestHeadersUriSpec delete() - { - return HEADERS_SPEC; - } - - @Override - public WebClient.RequestHeadersUriSpec options() - { - return HEADERS_SPEC; - } - - @Override - public WebClient.RequestBodyUriSpec method(HttpMethod hm) - { - return REQUEST_BODY_SPEC; - } - - @Override - public WebClient.Builder mutate() - { - throw new UnsupportedOperationException("Stub is immutable!"); - } - - - public static class RequestHeadersUriSpecStub implements WebClient.RequestHeadersUriSpec - { - private RequestHeadersUriSpecStub() {} - - - @Override - public WebClient.RequestHeadersSpec uri(URI uri) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec uri(String string, Object... os) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec uri(String string, Map map) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec uri(String string, Function fnctn) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec uri(Function fnctn) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec accept(MediaType... mts) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec acceptCharset(Charset... chrsts) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec cookie(String string, String string1) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec cookies(Consumer cnsmr) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec ifModifiedSince(ZonedDateTime zdt) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec ifNoneMatch(String... strings) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec header(String string, String... strings) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec headers(Consumer cnsmr) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec attribute(String string, Object o) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec attributes(Consumer cnsmr) - { - return this; - } - - @Override - public WebClient.ResponseSpec retrieve() - { - return RESPONSE_SPEC; - } - - @Override - public Mono exchange() - { - return WebClientStub.TO_MONO.get(); - } - } - - public static class RequestBodySpecStub implements WebClient.RequestBodyUriSpec - { - private RequestBodySpecStub() {} - - - @Override - public WebClient.RequestBodySpec contentLength(long l) - { - return this; - } - - @Override - public WebClient.RequestBodySpec contentType(MediaType mt) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec bodyValue(Object o) - { - return this; - } - - @Override - public > WebClient.RequestHeadersSpec body(P p, Class type) - { - return this; - } - - @Override - public > WebClient.RequestHeadersSpec body(P p, ParameterizedTypeReference ptr) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec body(Object o, Class type) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec body(Object o, ParameterizedTypeReference ptr) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec body( BodyInserter bi) - { - return this; - } - - @Override - public WebClient.RequestHeadersSpec syncBody(Object o) - { - return this; - } - - @Override - public WebClient.RequestBodySpec accept(MediaType... mts) - { - return this; - } - - @Override - public WebClient.RequestBodySpec acceptCharset(Charset... chrsts) - { - return this; - } - - @Override - public WebClient.RequestBodySpec cookie(String string, String string1) - { - return this; - } - - @Override - public WebClient.RequestBodySpec cookies(Consumer> cnsmr) - { - return this; - } - - @Override - public WebClient.RequestBodySpec ifModifiedSince(ZonedDateTime zdt) - { - return this; - } - - @Override - public WebClient.RequestBodySpec ifNoneMatch(String... strings) - { - return this; - } - - @Override - public WebClient.RequestBodySpec header(String string, String... strings) - { - return this; - } - - @Override - public WebClient.RequestBodySpec headers(Consumer cnsmr) - { - return this; - } - - @Override - public WebClient.RequestBodySpec attribute(String string, Object o) - { - return this; - } - - @Override - public WebClient.RequestBodySpec attributes(Consumer> cnsmr) - { - return this; - } - - @Override - public WebClient.ResponseSpec retrieve() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public Mono exchange() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public WebClient.RequestBodySpec uri(URI uri) - { - return this; - } - - @Override - public WebClient.RequestBodySpec uri(String string, Object... os) - { - return this; - } - - @Override - public WebClient.RequestBodySpec uri(String string, Map map) - { - return this; - } - - @Override - public WebClient.RequestBodySpec uri(String string, Function fnctn) - { - return this; - } - - @Override - public WebClient.RequestBodySpec uri(Function fnctn) - { - return this; - } - } - - public static class ResponseSpecStub implements WebClient.ResponseSpec - { - private ResponseSpecStub() {} - - - @Override - public WebClient.ResponseSpec onStatus(Predicate statusPredicate, Function> exceptionFunction) - { - return this; - } - - @Override - public WebClient.ResponseSpec onRawStatus(IntPredicate statusCodePredicate, Function> exceptionFunction) - { - return this; - } - - @Override - public Mono bodyToMono(Class elementClass) - { - return (Mono)TO_MONO.get(); - } - - @Override - public Mono bodyToMono(ParameterizedTypeReference elementTypeRef) - { - return (Mono)TO_MONO.get(); - } - - @Override - public Flux bodyToFlux(Class elementClass) - { - return (Flux)TO_FLUX; - } - - @Override - public Flux bodyToFlux(ParameterizedTypeReference elementTypeRef) - { - return (Flux)TO_FLUX; - } - - @Override - public Mono> toEntity(Class bodyClass) - { - return (Mono>)TO_MONO.get(); - } - - @Override - public Mono> toEntity(ParameterizedTypeReference bodyTypeReference) - { - return (Mono>)TO_MONO.get(); - } - - @Override - public Mono>> toEntityList(Class elementClass) - { - return (Mono>>)TO_MONO.get(); - } - - @Override - public Mono>> toEntityList(ParameterizedTypeReference elementTypeRef) - { - return (Mono>>)TO_MONO.get(); - } - - @Override - public Mono> toBodilessEntity() - { - return (Mono>)TO_MONO.get(); - } - } -} -- 2.20.1