Implemented a WebClientStub to simplify the unit-test
[demos/testing] / src / test / java / de / juplo / demo / WebClientStub.java
1 package de.juplo.demo;
2
3
4 import java.net.URI;
5 import java.nio.charset.Charset;
6 import java.time.ZonedDateTime;
7 import java.util.List;
8 import java.util.Map;
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.reactivestreams.Publisher;
15 import org.springframework.core.ParameterizedTypeReference;
16 import org.springframework.http.HttpHeaders;
17 import org.springframework.http.HttpMethod;
18 import org.springframework.http.HttpStatus;
19 import org.springframework.http.MediaType;
20 import org.springframework.http.ResponseEntity;
21 import org.springframework.http.client.reactive.ClientHttpRequest;
22 import org.springframework.util.MultiValueMap;
23 import org.springframework.web.reactive.function.BodyInserter;
24 import org.springframework.web.reactive.function.client.ClientResponse;
25 import org.springframework.web.reactive.function.client.WebClient;
26 import org.springframework.web.util.UriBuilder;
27 import reactor.core.publisher.Flux;
28 import reactor.core.publisher.Mono;
29
30
31 /**
32  * A stub for {@link WebClient}, that can be used for mocking.
33  * @author Kai Moritz
34  */
35 public class WebClientStub implements WebClient
36 {
37   public final static WebClientStub WEB_CLIENT = new WebClientStub();
38   public final static RequestHeadersUriSpecStub HEADERS_SPEC = new RequestHeadersUriSpecStub();
39   public final static RequestBodySpecStub REQUEST_BODY_SPEC = new RequestBodySpecStub();
40   public final static ResponseSpecStub RESPONSE_SPEC = new ResponseSpecStub();
41
42   private static Supplier<Mono<?>> TO_MONO = () -> null;
43   private static Supplier<Flux<?>> TO_FLUX = () -> null;
44
45
46   public static void expect(Mono<?> mono) { TO_MONO = () -> mono; }
47   public static void expect(Flux<?> flux) { TO_FLUX = () -> flux; }
48
49
50   private WebClientStub() {}
51
52
53   @Override
54   public WebClient.RequestHeadersUriSpec<?> get()
55   {
56     return HEADERS_SPEC;
57   }
58
59   @Override
60   public WebClient.RequestHeadersUriSpec<?> head()
61   {
62     return HEADERS_SPEC;
63   }
64
65   @Override
66   public WebClient.RequestBodyUriSpec post()
67   {
68     return REQUEST_BODY_SPEC;
69   }
70
71   @Override
72   public WebClient.RequestBodyUriSpec put()
73   {
74     return REQUEST_BODY_SPEC;
75   }
76
77   @Override
78   public WebClient.RequestBodyUriSpec patch()
79   {
80     return REQUEST_BODY_SPEC;
81   }
82
83   @Override
84   public WebClient.RequestHeadersUriSpec<?> delete()
85   {
86     return HEADERS_SPEC;
87   }
88
89   @Override
90   public WebClient.RequestHeadersUriSpec<?> options()
91   {
92     return HEADERS_SPEC;
93   }
94
95   @Override
96   public WebClient.RequestBodyUriSpec method(HttpMethod hm)
97   {
98     return REQUEST_BODY_SPEC;
99   }
100
101   @Override
102   public WebClient.Builder mutate()
103   {
104     throw new UnsupportedOperationException("Stub is immutable!");
105   }
106
107
108   public static class RequestHeadersUriSpecStub implements WebClient.RequestHeadersUriSpec
109   {
110     private RequestHeadersUriSpecStub() {}
111
112
113     @Override
114     public WebClient.RequestHeadersSpec uri(URI uri)
115     {
116       return this;
117     }
118
119     @Override
120     public WebClient.RequestHeadersSpec uri(String string, Object... os)
121     {
122       return this;
123     }
124
125     @Override
126     public WebClient.RequestHeadersSpec uri(String string, Map map)
127     {
128       return this;
129     }
130
131     @Override
132     public WebClient.RequestHeadersSpec uri(String string, Function fnctn)
133     {
134       return this;
135     }
136
137     @Override
138     public WebClient.RequestHeadersSpec uri(Function fnctn)
139     {
140       return this;
141     }
142
143     @Override
144     public WebClient.RequestHeadersSpec accept(MediaType... mts)
145     {
146       return this;
147     }
148
149     @Override
150     public WebClient.RequestHeadersSpec acceptCharset(Charset... chrsts)
151     {
152       return this;
153     }
154
155     @Override
156     public WebClient.RequestHeadersSpec cookie(String string, String string1)
157     {
158       return this;
159     }
160
161     @Override
162     public WebClient.RequestHeadersSpec cookies(Consumer cnsmr)
163     {
164       return this;
165     }
166
167     @Override
168     public WebClient.RequestHeadersSpec ifModifiedSince(ZonedDateTime zdt)
169     {
170       return this;
171     }
172
173     @Override
174     public WebClient.RequestHeadersSpec ifNoneMatch(String... strings)
175     {
176       return this;
177     }
178
179     @Override
180     public WebClient.RequestHeadersSpec header(String string, String... strings)
181     {
182       return this;
183     }
184
185     @Override
186     public WebClient.RequestHeadersSpec headers(Consumer cnsmr)
187     {
188       return this;
189     }
190
191     @Override
192     public WebClient.RequestHeadersSpec attribute(String string, Object o)
193     {
194       return this;
195     }
196
197     @Override
198     public WebClient.RequestHeadersSpec attributes(Consumer cnsmr)
199     {
200       return this;
201     }
202
203     @Override
204     public WebClient.ResponseSpec retrieve()
205     {
206       return RESPONSE_SPEC;
207     }
208
209     @Override
210     public Mono exchange()
211     {
212       return WebClientStub.TO_MONO.get();
213     }
214   }
215
216   public static class RequestBodySpecStub implements WebClient.RequestBodyUriSpec
217   {
218     private RequestBodySpecStub() {}
219
220
221     @Override
222     public WebClient.RequestBodySpec contentLength(long l)
223     {
224       return this;
225     }
226
227     @Override
228     public WebClient.RequestBodySpec contentType(MediaType mt)
229     {
230       return this;
231     }
232
233     @Override
234     public WebClient.RequestHeadersSpec<?> bodyValue(Object o)
235     {
236       return this;
237     }
238
239     @Override
240     public <T, P extends Publisher<T>> WebClient.RequestHeadersSpec<?> body(P p, Class<T> type)
241     {
242       return this;
243     }
244
245     @Override
246     public <T, P extends Publisher<T>> WebClient.RequestHeadersSpec<?> body(P p, ParameterizedTypeReference<T> ptr)
247     {
248       return this;
249     }
250
251     @Override
252     public WebClient.RequestHeadersSpec<?> body(Object o, Class<?> type)
253     {
254       return this;
255     }
256
257     @Override
258     public WebClient.RequestHeadersSpec<?> body(Object o, ParameterizedTypeReference<?> ptr)
259     {
260       return this;
261     }
262
263     @Override
264     public WebClient.RequestHeadersSpec<?> body( BodyInserter<?, ? super ClientHttpRequest> bi)
265     {
266       return this;
267     }
268
269     @Override
270     public WebClient.RequestHeadersSpec<?> syncBody(Object o)
271     {
272       return this;
273     }
274
275     @Override
276     public WebClient.RequestBodySpec accept(MediaType... mts)
277     {
278       return this;
279     }
280
281     @Override
282     public WebClient.RequestBodySpec acceptCharset(Charset... chrsts)
283     {
284       return this;
285     }
286
287     @Override
288     public WebClient.RequestBodySpec cookie(String string, String string1)
289     {
290       return this;
291     }
292
293     @Override
294     public WebClient.RequestBodySpec cookies(Consumer<MultiValueMap<String, String>> cnsmr)
295     {
296       return this;
297     }
298
299     @Override
300     public WebClient.RequestBodySpec ifModifiedSince(ZonedDateTime zdt)
301     {
302       return this;
303     }
304
305     @Override
306     public WebClient.RequestBodySpec ifNoneMatch(String... strings)
307     {
308       return this;
309     }
310
311     @Override
312     public WebClient.RequestBodySpec header(String string, String... strings)
313     {
314       return this;
315     }
316
317     @Override
318     public WebClient.RequestBodySpec headers(Consumer<HttpHeaders> cnsmr)
319     {
320       return this;
321     }
322
323     @Override
324     public WebClient.RequestBodySpec attribute(String string, Object o)
325     {
326       return this;
327     }
328
329     @Override
330     public WebClient.RequestBodySpec attributes(Consumer<Map<String, Object>> cnsmr)
331     {
332       return this;
333     }
334
335     @Override
336     public WebClient.ResponseSpec retrieve()
337     {
338       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
339     }
340
341     @Override
342     public Mono<ClientResponse> exchange()
343     {
344       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
345     }
346
347     @Override
348     public WebClient.RequestBodySpec uri(URI uri)
349     {
350       return this;
351     }
352
353     @Override
354     public WebClient.RequestBodySpec uri(String string, Object... os)
355     {
356       return this;
357     }
358
359     @Override
360     public WebClient.RequestBodySpec uri(String string, Map<String, ?> map)
361     {
362       return this;
363     }
364
365     @Override
366     public WebClient.RequestBodySpec uri(String string, Function<UriBuilder, URI> fnctn)
367     {
368       return this;
369     }
370
371     @Override
372     public WebClient.RequestBodySpec uri(Function<UriBuilder, URI> fnctn)
373     {
374       return this;
375     }
376   }
377
378   public static class ResponseSpecStub implements WebClient.ResponseSpec
379   {
380     private ResponseSpecStub() {}
381
382
383     @Override
384     public WebClient.ResponseSpec onStatus(Predicate<HttpStatus> statusPredicate, Function<ClientResponse, Mono<? extends Throwable>> exceptionFunction)
385     {
386       return this;
387     }
388
389     @Override
390     public WebClient.ResponseSpec onRawStatus(IntPredicate statusCodePredicate, Function<ClientResponse, Mono<? extends Throwable>> exceptionFunction)
391     {
392       return this;
393     }
394
395     @Override
396     public <T> Mono<T> bodyToMono(Class<T> elementClass)
397     {
398       return (Mono<T>)TO_MONO.get();
399     }
400
401     @Override
402     public <T> Mono<T> bodyToMono(ParameterizedTypeReference<T> elementTypeRef)
403     {
404       return (Mono<T>)TO_MONO.get();
405     }
406
407     @Override
408     public <T> Flux<T> bodyToFlux(Class<T> elementClass)
409     {
410       return (Flux<T>)TO_FLUX;
411     }
412
413     @Override
414     public <T> Flux<T> bodyToFlux(ParameterizedTypeReference<T> elementTypeRef)
415     {
416       return (Flux<T>)TO_FLUX;
417     }
418
419     @Override
420     public <T> Mono<ResponseEntity<T>> toEntity(Class<T> bodyClass)
421     {
422       return (Mono<ResponseEntity<T>>)TO_MONO.get();
423     }
424
425     @Override
426     public <T> Mono<ResponseEntity<T>> toEntity(ParameterizedTypeReference<T> bodyTypeReference)
427     {
428       return (Mono<ResponseEntity<T>>)TO_MONO.get();
429     }
430
431     @Override
432     public <T> Mono<ResponseEntity<List<T>>> toEntityList(Class<T> elementClass)
433     {
434       return (Mono<ResponseEntity<List<T>>>)TO_MONO.get();
435     }
436
437     @Override
438     public <T> Mono<ResponseEntity<List<T>>> toEntityList(ParameterizedTypeReference<T> elementTypeRef)
439     {
440       return (Mono<ResponseEntity<List<T>>>)TO_MONO.get();
441     }
442
443     @Override
444     public Mono<ResponseEntity<Void>> toBodilessEntity()
445     {
446       return (Mono<ResponseEntity<Void>>)TO_MONO.get();
447     }
448   }
449 }