5 import java.nio.charset.Charset;
6 import java.time.ZonedDateTime;
9 import java.util.function.Consumer;
10 import java.util.function.Function;
11 import java.util.function.IntPredicate;
12 import java.util.function.Predicate;
13 import java.util.function.Supplier;
14 import org.junit.jupiter.api.BeforeEach;
15 import org.junit.jupiter.api.Test;
16 import org.junit.jupiter.api.extension.ExtendWith;
17 import static org.mockito.ArgumentMatchers.eq;
18 import static org.mockito.Mockito.when;
19 import org.reactivestreams.Publisher;
20 import org.springframework.boot.test.mock.mockito.MockBean;
21 import org.springframework.core.ParameterizedTypeReference;
22 import org.springframework.http.HttpHeaders;
23 import org.springframework.http.HttpMethod;
24 import org.springframework.http.HttpStatus;
25 import org.springframework.http.MediaType;
26 import org.springframework.http.ResponseEntity;
27 import org.springframework.http.client.reactive.ClientHttpRequest;
28 import org.springframework.test.context.junit.jupiter.SpringExtension;
29 import org.springframework.util.MultiValueMap;
30 import org.springframework.web.reactive.function.BodyInserter;
31 import org.springframework.web.reactive.function.client.ClientResponse;
32 import org.springframework.web.reactive.function.client.WebClient;
33 import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec;
34 import org.springframework.web.reactive.function.client.WebClient.RequestHeadersUriSpec;
35 import org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
36 import org.springframework.web.util.UriBuilder;
37 import reactor.core.publisher.Flux;
38 import reactor.core.publisher.Mono;
39 import reactor.test.StepVerifier;
43 * Unit-Test for class {@link RemoteContentService}.
46 @ExtendWith(SpringExtension.class)
47 public class RemoteContentServiceTest
49 RemoteContentService service;
53 @MockBean(name = "uriSpec")
54 RequestHeadersUriSpec uriSpec;
55 @MockBean(name = "headersSpec")
56 RequestHeadersSpec headersSpec;
57 @MockBean(name = "responseSpec")
58 ResponseSpec responseSpec;
64 service = new RemoteContentService(webClient);
71 when(webClient.get()).thenReturn(uriSpec);
72 when(uriSpec.uri(eq("/foo"))).thenReturn(headersSpec);
73 when(headersSpec.retrieve()).thenReturn(responseSpec);
74 when(responseSpec.bodyToMono(String.class)).thenReturn(Mono.just("bar"));
76 Mono<String> result = service.getRemoteText("/foo");
85 static class WebClientStub implements WebClient
87 final static WebClientStub WEB_CLIENT = new WebClientStub();
88 final static RequestHeadersUriSpecStub HEADERS_SPEC = new RequestHeadersUriSpecStub();
89 final static RequestBodySpecStub REQUEST_BODY_SPEC = new RequestBodySpecStub();
90 final static ResponseSpecStub RESPONSE_SPEC = new ResponseSpecStub();
92 static Supplier<Mono<?>> toMono;
93 static Supplier<Flux<?>> toFlux;
96 private WebClientStub() {}
100 public RequestHeadersUriSpec<?> get()
106 public RequestHeadersUriSpec<?> head()
112 public RequestBodyUriSpec post()
114 return REQUEST_BODY_SPEC;
118 public RequestBodyUriSpec put()
120 return REQUEST_BODY_SPEC;
124 public RequestBodyUriSpec patch()
126 return REQUEST_BODY_SPEC;
130 public RequestHeadersUriSpec<?> delete()
136 public RequestHeadersUriSpec<?> options()
142 public RequestBodyUriSpec method(HttpMethod hm)
144 return REQUEST_BODY_SPEC;
148 public Builder mutate()
150 throw new UnsupportedOperationException("Stub is immutable!");
154 static class RequestHeadersUriSpecStub implements RequestHeadersUriSpec
156 private RequestHeadersUriSpecStub() {}
160 public RequestHeadersSpec uri(URI uri)
166 public RequestHeadersSpec uri(String string, Object... os)
172 public RequestHeadersSpec uri(String string, Map map)
178 public RequestHeadersSpec uri(String string, Function fnctn)
184 public RequestHeadersSpec uri(Function fnctn)
190 public RequestHeadersSpec accept(MediaType... mts)
196 public RequestHeadersSpec acceptCharset(Charset... chrsts)
202 public RequestHeadersSpec cookie(String string, String string1)
208 public RequestHeadersSpec cookies(Consumer cnsmr)
214 public RequestHeadersSpec ifModifiedSince(ZonedDateTime zdt)
220 public RequestHeadersSpec ifNoneMatch(String... strings)
226 public RequestHeadersSpec header(String string, String... strings)
232 public RequestHeadersSpec headers(Consumer cnsmr)
238 public RequestHeadersSpec attribute(String string, Object o)
244 public RequestHeadersSpec attributes(Consumer cnsmr)
250 public ResponseSpec retrieve()
252 return RESPONSE_SPEC;
256 public Mono exchange()
258 return WebClientStub.toMono.get();
262 static class RequestBodySpecStub implements RequestBodyUriSpec
264 private RequestBodySpecStub() {}
268 public RequestBodySpec contentLength(long l)
274 public RequestBodySpec contentType(MediaType mt)
280 public RequestHeadersSpec<?> bodyValue(Object o)
286 public <T, P extends Publisher<T>> RequestHeadersSpec<?> body(P p, Class<T> type)
292 public <T, P extends Publisher<T>> RequestHeadersSpec<?> body(P p, ParameterizedTypeReference<T> ptr)
298 public RequestHeadersSpec<?> body(Object o, Class<?> type)
304 public RequestHeadersSpec<?> body(Object o, ParameterizedTypeReference<?> ptr)
310 public RequestHeadersSpec<?> body( BodyInserter<?, ? super ClientHttpRequest> bi)
316 public RequestHeadersSpec<?> syncBody(Object o)
322 public RequestBodySpec accept(MediaType... mts)
328 public RequestBodySpec acceptCharset(Charset... chrsts)
334 public RequestBodySpec cookie(String string, String string1)
340 public RequestBodySpec cookies(Consumer<MultiValueMap<String, String>> cnsmr)
346 public RequestBodySpec ifModifiedSince(ZonedDateTime zdt)
352 public RequestBodySpec ifNoneMatch(String... strings)
358 public RequestBodySpec header(String string, String... strings)
364 public RequestBodySpec headers(Consumer<HttpHeaders> cnsmr)
370 public RequestBodySpec attribute(String string, Object o)
376 public RequestBodySpec attributes(Consumer<Map<String, Object>> cnsmr)
382 public ResponseSpec retrieve()
384 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
388 public Mono<ClientResponse> exchange()
390 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
394 public RequestBodySpec uri(URI uri)
400 public RequestBodySpec uri(String string, Object... os)
406 public RequestBodySpec uri(String string, Map<String, ?> map)
412 public RequestBodySpec uri(String string, Function<UriBuilder, URI> fnctn)
418 public RequestBodySpec uri(Function<UriBuilder, URI> fnctn)
424 static class ResponseSpecStub implements ResponseSpec
426 private ResponseSpecStub() {}
430 public ResponseSpec onStatus(Predicate<HttpStatus> statusPredicate, Function<ClientResponse, Mono<? extends Throwable>> exceptionFunction)
436 public ResponseSpec onRawStatus(IntPredicate statusCodePredicate, Function<ClientResponse, Mono<? extends Throwable>> exceptionFunction)
442 public <T> Mono<T> bodyToMono(Class<T> elementClass)
444 return (Mono<T>)toMono.get();
448 public <T> Mono<T> bodyToMono(ParameterizedTypeReference<T> elementTypeRef)
450 return (Mono<T>)toMono.get();
454 public <T> Flux<T> bodyToFlux(Class<T> elementClass)
456 return (Flux<T>)toFlux;
460 public <T> Flux<T> bodyToFlux(ParameterizedTypeReference<T> elementTypeRef)
462 return (Flux<T>)toFlux;
466 public <T> Mono<ResponseEntity<T>> toEntity(Class<T> bodyClass)
468 return (Mono<ResponseEntity<T>>)toMono.get();
472 public <T> Mono<ResponseEntity<T>> toEntity(ParameterizedTypeReference<T> bodyTypeReference)
474 return (Mono<ResponseEntity<T>>)toMono.get();
478 public <T> Mono<ResponseEntity<List<T>>> toEntityList(Class<T> elementClass)
480 return (Mono<ResponseEntity<List<T>>>)toMono.get();
484 public <T> Mono<ResponseEntity<List<T>>> toEntityList(ParameterizedTypeReference<T> elementTypeRef)
486 return (Mono<ResponseEntity<List<T>>>)toMono.get();
490 public Mono<ResponseEntity<Void>> toBodilessEntity()
492 return (Mono<ResponseEntity<Void>>)toMono.get();