a8cecab31d5d75991e3b7246c5b3ccc9623aa098
[demos/testing] / src / test / java / de / juplo / demo / RemoteContentServiceTest.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.Map;
8 import java.util.function.Consumer;
9 import java.util.function.Function;
10 import org.junit.jupiter.api.BeforeEach;
11 import org.junit.jupiter.api.Test;
12 import org.junit.jupiter.api.extension.ExtendWith;
13 import static org.mockito.ArgumentMatchers.eq;
14 import static org.mockito.Mockito.when;
15 import org.reactivestreams.Publisher;
16 import org.springframework.boot.test.mock.mockito.MockBean;
17 import org.springframework.core.ParameterizedTypeReference;
18 import org.springframework.http.HttpHeaders;
19 import org.springframework.http.HttpMethod;
20 import org.springframework.http.MediaType;
21 import org.springframework.http.client.reactive.ClientHttpRequest;
22 import org.springframework.test.context.junit.jupiter.SpringExtension;
23 import org.springframework.util.MultiValueMap;
24 import org.springframework.web.reactive.function.BodyInserter;
25 import org.springframework.web.reactive.function.client.ClientResponse;
26 import org.springframework.web.reactive.function.client.WebClient;
27 import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec;
28 import org.springframework.web.reactive.function.client.WebClient.RequestHeadersUriSpec;
29 import org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
30 import org.springframework.web.util.UriBuilder;
31 import reactor.core.publisher.Mono;
32 import reactor.test.StepVerifier;
33
34
35 /**
36  * Unit-Test for class {@link RemoteContentService}.
37  * @author Kai Moritz
38  */
39 @ExtendWith(SpringExtension.class)
40 public class RemoteContentServiceTest
41 {
42   RemoteContentService service;
43
44   @MockBean
45   WebClient webClient;
46   @MockBean(name = "uriSpec")
47   RequestHeadersUriSpec uriSpec;
48   @MockBean(name = "headersSpec")
49   RequestHeadersSpec headersSpec;
50   @MockBean(name = "responseSpec")
51   ResponseSpec responseSpec;
52
53
54   @BeforeEach
55   void setUp()
56   {
57     service = new RemoteContentService(webClient);
58   }
59
60
61   @Test
62   void test()
63   {
64     when(webClient.get()).thenReturn(uriSpec);
65     when(uriSpec.uri(eq("/foo"))).thenReturn(headersSpec);
66     when(headersSpec.retrieve()).thenReturn(responseSpec);
67     when(responseSpec.bodyToMono(String.class)).thenReturn(Mono.just("bar"));
68
69     Mono<String> result = service.getRemoteText("/foo");
70
71     StepVerifier
72         .create(result)
73         .expectNext("bar")
74         .verifyComplete();
75   }
76
77
78   static class WebClientStub implements WebClient
79   {
80     final static WebClientStub WEB_CLIENT = new WebClientStub();
81     final static RequestHeadersUriSpecStub URI_SPEC = new RequestHeadersUriSpecStub();
82     final static RequestBodySpecStub BODY_SPEC = new RequestBodySpecStub();
83
84
85     private WebClientStub() {}
86
87
88     @Override
89     public RequestHeadersUriSpec<?> get()
90     {
91       return URI_SPEC;
92     }
93
94     @Override
95     public RequestHeadersUriSpec<?> head()
96     {
97       return URI_SPEC;
98     }
99
100     @Override
101     public RequestBodyUriSpec post()
102     {
103       return BODY_SPEC;
104     }
105
106     @Override
107     public RequestBodyUriSpec put()
108     {
109       return BODY_SPEC;
110     }
111
112     @Override
113     public RequestBodyUriSpec patch()
114     {
115       return BODY_SPEC;
116     }
117
118     @Override
119     public RequestHeadersUriSpec<?> delete()
120     {
121       return URI_SPEC;
122     }
123
124     @Override
125     public RequestHeadersUriSpec<?> options()
126     {
127       return URI_SPEC;
128     }
129
130     @Override
131     public RequestBodyUriSpec method(HttpMethod hm)
132     {
133       return BODY_SPEC;
134     }
135
136     @Override
137     public Builder mutate()
138     {
139       throw new UnsupportedOperationException("Stub is immutable!");
140     }
141
142
143     static class RequestHeadersUriSpecStub implements RequestHeadersUriSpec
144     {
145       private RequestHeadersUriSpecStub() {}
146
147
148       @Override
149       public RequestHeadersSpec uri(URI uri)
150       {
151         return this;
152       }
153
154       @Override
155       public RequestHeadersSpec uri(String string, Object... os)
156       {
157         return this;
158       }
159
160       @Override
161       public RequestHeadersSpec uri(String string, Map map)
162       {
163         return this;
164       }
165
166       @Override
167       public RequestHeadersSpec uri(String string, Function fnctn)
168       {
169         return this;
170       }
171
172       @Override
173       public RequestHeadersSpec uri(Function fnctn)
174       {
175         return this;
176       }
177
178       @Override
179       public RequestHeadersSpec accept(MediaType... mts)
180       {
181         return this;
182       }
183
184       @Override
185       public RequestHeadersSpec acceptCharset(Charset... chrsts)
186       {
187         return this;
188       }
189
190       @Override
191       public RequestHeadersSpec cookie(String string, String string1)
192       {
193         return this;
194       }
195
196       @Override
197       public RequestHeadersSpec cookies(Consumer cnsmr)
198       {
199         return this;
200       }
201
202       @Override
203       public RequestHeadersSpec ifModifiedSince(ZonedDateTime zdt)
204       {
205         return this;
206       }
207
208       @Override
209       public RequestHeadersSpec ifNoneMatch(String... strings)
210       {
211         return this;
212       }
213
214       @Override
215       public RequestHeadersSpec header(String string, String... strings)
216       {
217         return this;
218       }
219
220       @Override
221       public RequestHeadersSpec headers(Consumer cnsmr)
222       {
223         return this;
224       }
225
226       @Override
227       public RequestHeadersSpec attribute(String string, Object o)
228       {
229         return this;
230       }
231
232       @Override
233       public RequestHeadersSpec attributes(Consumer cnsmr)
234       {
235         return this;
236       }
237
238       @Override
239       public ResponseSpec retrieve()
240       {
241       }
242
243       @Override
244       public Mono exchange()
245       {
246       }
247     }
248
249     static class RequestBodySpecStub implements RequestBodyUriSpec
250     {
251       private RequestBodySpecStub() {}
252
253
254       @Override
255       public RequestBodySpec contentLength(long l)
256       {
257         return this;
258       }
259
260       @Override
261       public RequestBodySpec contentType(MediaType mt)
262       {
263         return this;
264       }
265
266       @Override
267       public RequestHeadersSpec<?> bodyValue(Object o)
268       {
269         return this;
270       }
271
272       @Override
273       public <T, P extends Publisher<T>> RequestHeadersSpec<?> body(P p, Class<T> type)
274       {
275         return this;
276       }
277
278       @Override
279       public <T, P extends Publisher<T>> RequestHeadersSpec<?> body(P p, ParameterizedTypeReference<T> ptr)
280       {
281         return this;
282       }
283
284       @Override
285       public RequestHeadersSpec<?> body(Object o, Class<?> type)
286       {
287         return this;
288       }
289
290       @Override
291       public RequestHeadersSpec<?> body(Object o, ParameterizedTypeReference<?> ptr)
292       {
293         return this;
294       }
295
296       @Override
297       public RequestHeadersSpec<?> body( BodyInserter<?, ? super ClientHttpRequest> bi)
298       {
299         return this;
300       }
301
302       @Override
303       public RequestHeadersSpec<?> syncBody(Object o)
304       {
305         return this;
306       }
307
308       @Override
309       public RequestBodySpec accept(MediaType... mts)
310       {
311         return this;
312       }
313
314       @Override
315       public RequestBodySpec acceptCharset(Charset... chrsts)
316       {
317         return this;
318       }
319
320       @Override
321       public RequestBodySpec cookie(String string, String string1)
322       {
323         return this;
324       }
325
326       @Override
327       public RequestBodySpec cookies(Consumer<MultiValueMap<String, String>> cnsmr)
328       {
329         return this;
330       }
331
332       @Override
333       public RequestBodySpec ifModifiedSince(ZonedDateTime zdt)
334       {
335         return this;
336       }
337
338       @Override
339       public RequestBodySpec ifNoneMatch(String... strings)
340       {
341         return this;
342       }
343
344       @Override
345       public RequestBodySpec header(String string, String... strings)
346       {
347         return this;
348       }
349
350       @Override
351       public RequestBodySpec headers(Consumer<HttpHeaders> cnsmr)
352       {
353         return this;
354       }
355
356       @Override
357       public RequestBodySpec attribute(String string, Object o)
358       {
359         return this;
360       }
361
362       @Override
363       public RequestBodySpec attributes(Consumer<Map<String, Object>> cnsmr)
364       {
365         return this;
366       }
367
368       @Override
369       public ResponseSpec retrieve()
370       {
371         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
372       }
373
374       @Override
375       public Mono<ClientResponse> exchange()
376       {
377         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
378       }
379
380       @Override
381       public RequestBodySpec uri(URI uri)
382       {
383         return this;
384       }
385
386       @Override
387       public RequestBodySpec uri(String string, Object... os)
388       {
389         return this;
390       }
391
392       @Override
393       public RequestBodySpec uri(String string, Map<String, ?> map)
394       {
395         return this;
396       }
397
398       @Override
399       public RequestBodySpec uri(String string, Function<UriBuilder, URI> fnctn)
400       {
401         return this;
402       }
403
404       @Override
405       public RequestBodySpec uri(Function<UriBuilder, URI> fnctn)
406       {
407         return this;
408       }
409     }
410   }
411 }