2020import java .util .List ;
2121import java .util .function .Predicate ;
2222
23+ import org .jspecify .annotations .Nullable ;
2324import org .junit .jupiter .api .Test ;
2425import org .mockito .ArgumentCaptor ;
2526import org .mockito .Mockito ;
4243import org .springframework .web .testfixture .http .client .MockClientHttpResponse ;
4344
4445import static org .assertj .core .api .Assertions .assertThat ;
45- import static org .assertj .core .api .Assertions .assertThatThrownBy ;
4646import static org .mockito .ArgumentMatchers .any ;
4747import static org .mockito .BDDMockito .given ;
4848import static org .mockito .Mockito .atLeastOnce ;
@@ -59,19 +59,20 @@ public class HttpServiceProxyRegistryFactoryBeanTests {
5959 void twoGroups () {
6060 String echoName = "echo" ;
6161 String greetingName = "greeting" ;
62- GroupsMetadata groupsMetadata = new GroupsMetadata ();
62+ GroupsMetadata metadata = new GroupsMetadata ();
6363
6464 List <String > echoServices = List .of (EchoA .class .getName (), EchoB .class .getName ());
65- groupsMetadata .getOrCreateGroup (echoName , REST_CLIENT ).httpServiceTypeNames ().addAll (echoServices );
65+ metadata .getOrCreateGroup (echoName , REST_CLIENT ).httpServiceTypeNames ().addAll (echoServices );
6666
6767 List <String > greetingServices = List .of (GreetingA .class .getName (), GreetingB .class .getName ());
68- groupsMetadata .getOrCreateGroup (greetingName , REST_CLIENT ).httpServiceTypeNames ().addAll (greetingServices );
68+ metadata .getOrCreateGroup (greetingName , REST_CLIENT ).httpServiceTypeNames ().addAll (greetingServices );
6969
7070 Predicate <HttpServiceGroup > echoFilter = group -> group .name ().equals (echoName );
7171 Predicate <HttpServiceGroup > greetingFilter = group -> group .name ().equals (greetingName );
7272 TestConfigurer groupConfigurer = new TestConfigurer (List .of (echoFilter , greetingFilter ));
7373
74- HttpServiceProxyRegistry registry = initProxyRegistry (groupConfigurer , groupsMetadata );
74+ HttpServiceProxyRegistry registry = initProxyRegistry (groupConfigurer , metadata , null );
75+
7576 assertThat (registry .getGroupNames ()).containsExactlyInAnyOrder (echoName , greetingName );
7677 assertThat (registry .getClientTypesInGroup (echoName )).containsExactlyInAnyOrder (EchoA .class , EchoB .class );
7778 assertThat (registry .getClientTypesInGroup (greetingName )).containsExactlyInAnyOrder (GreetingA .class , GreetingB .class );
@@ -84,9 +85,6 @@ void twoGroups() {
8485
8586 @ Test
8687 void initializeClientBuilder () throws Exception {
87- GroupsMetadata groupsMetadata = new GroupsMetadata ();
88- groupsMetadata .getOrCreateGroup ("echo" , REST_CLIENT ).httpServiceTypeNames ().add (EchoA .class .getName ());
89-
9088 ClientHttpRequestFactory requestFactory = Mockito .mock (ClientHttpRequestFactory .class );
9189 MockClientHttpRequest request = new MockClientHttpRequest ();
9290 request .setResponse (new MockClientHttpResponse ());
@@ -95,95 +93,47 @@ void initializeClientBuilder() throws Exception {
9593 RestClient .Builder clientBuilder = RestClient .builder ().baseUrl ("/" ).requestFactory (requestFactory );
9694 RestClientHttpServiceGroupConfigurer groupConfigurer = groups -> groups .forEachClient (group -> clientBuilder );
9795
98- HttpServiceProxyRegistry registry = initProxyRegistry (groupConfigurer , groupsMetadata );
96+ GroupsMetadata metadata = new GroupsMetadata ();
97+ metadata .getOrCreateGroup ("echo" , REST_CLIENT ).httpServiceTypeNames ().add (EchoA .class .getName ());
98+
99+ HttpServiceProxyRegistry registry = initProxyRegistry (groupConfigurer , metadata , null );
99100 registry .getClient (EchoA .class ).handle ("foo" );
100101
101102 verify (requestFactory , atLeastOnce ()).createRequest (any (), any ());
102103 }
103104
104105 @ Test
105- void propertyPlaceholderInHttpExchangeUrlIsResolved () throws Exception {
106- GroupsMetadata groupsMetadata = new GroupsMetadata ();
107- groupsMetadata .getOrCreateGroup ("testGroup" , REST_CLIENT )
108- .httpServiceTypeNames ()
109- .add (PlaceholderService .class .getName ());
106+ void propertyPlaceholder () throws Exception {
107+ GroupsMetadata metadata = new GroupsMetadata ();
108+ metadata .getOrCreateGroup ("group" , REST_CLIENT ).httpServiceTypeNames ().add (PlaceholderService .class .getName ());
110109
111110 ClientHttpRequestFactory requestFactory = Mockito .mock (ClientHttpRequestFactory .class );
112- MockClientHttpRequest mockRequest = new MockClientHttpRequest ();
113- mockRequest .setResponse (new MockClientHttpResponse ());
111+ MockClientHttpRequest request = new MockClientHttpRequest ();
112+ request .setResponse (new MockClientHttpResponse ());
114113
115114 ArgumentCaptor <URI > uriCaptor = ArgumentCaptor .forClass (URI .class );
116- given (requestFactory .createRequest (uriCaptor .capture (), any ())).willReturn (mockRequest );
117-
118- StringValueResolver resolver = value -> {
119- if (value .contains ("${test.base.url}" )) {
120- return value .replace ("${test.base.url}" , "https://api.example.com" );
121- }
122- return value ;
123- };
115+ given (requestFactory .createRequest (uriCaptor .capture (), any ())).willReturn (request );
124116
125117 RestClient .Builder clientBuilder = RestClient .builder ().requestFactory (requestFactory );
126-
127118 RestClientHttpServiceGroupConfigurer configurer = groups -> groups .forEachClient (group -> clientBuilder );
128119
129- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
130- context .registerBean (RestClientHttpServiceGroupConfigurer .class , () -> configurer );
131- context .refresh ();
132-
133- HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean (groupsMetadata );
134-
135- factoryBean .setApplicationContext (context );
136- factoryBean .setBeanClassLoader (getClass ().getClassLoader ());
137- factoryBean .setEmbeddedValueResolver (resolver );
138- factoryBean .afterPropertiesSet ();
139-
140- HttpServiceProxyRegistry registry = factoryBean .getObject ();
141- PlaceholderService service = registry .getClient (PlaceholderService .class );
142- service .callEndpoint ();
143-
144- URI requestedUri = uriCaptor .getValue ();
145-
146- assertThat (requestedUri .toString ())
147- .startsWith ("https://api.example.com" )
148- .doesNotContain ("${" )
149- .contains ("/endpoint" );
150- }
151-
152- @ Test
153- void withoutResolverPlaceholderRemainsUnresolved () throws Exception {
154- GroupsMetadata groupsMetadata = new GroupsMetadata ();
155- groupsMetadata .getOrCreateGroup ("testGroup" , REST_CLIENT )
156- .httpServiceTypeNames ()
157- .add (PlaceholderService .class .getName ());
158-
159- ClientHttpRequestFactory requestFactory = Mockito .mock (ClientHttpRequestFactory .class );
160- MockClientHttpRequest capturedRequest = new MockClientHttpRequest ();
161- capturedRequest .setResponse (new MockClientHttpResponse ());
162- given (requestFactory .createRequest (any (), any ())).willReturn (capturedRequest );
163-
164- RestClient .Builder clientBuilder = RestClient .builder ().requestFactory (requestFactory );
165- RestClientHttpServiceGroupConfigurer configurer = groups ->
166- groups .forEachClient (group -> clientBuilder );
167-
168- AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
169- context .registerBean (RestClientHttpServiceGroupConfigurer .class , () -> configurer );
170- context .refresh ();
171-
172- HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean (groupsMetadata );
173- factoryBean .setApplicationContext (context );
174- factoryBean .setBeanClassLoader (getClass ().getClassLoader ());
175- factoryBean .afterPropertiesSet ();
120+ String baseUrl = "https://api.example.com" ;
121+ HttpServiceProxyRegistry registry = initProxyRegistry (configurer , metadata , value -> {
122+ if (value .contains ("${test.base.url}" )) {
123+ return value .replace ("${test.base.url}" , baseUrl );
124+ }
125+ return value ;
126+ });
176127
177- HttpServiceProxyRegistry registry = factoryBean .getObject ();
178128 PlaceholderService service = registry .getClient (PlaceholderService .class );
129+ service .invoke ();
179130
180- assertThatThrownBy (service ::callEndpoint )
181- .isInstanceOf (IllegalArgumentException .class )
182- .hasMessageContaining ("test.base.url" );
131+ assertThat (uriCaptor .getValue ().toString ()).isEqualTo (baseUrl );
183132 }
184133
185134 private HttpServiceProxyRegistry initProxyRegistry (
186- RestClientHttpServiceGroupConfigurer groupConfigurer , GroupsMetadata groupsMetadata ) {
135+ RestClientHttpServiceGroupConfigurer groupConfigurer , GroupsMetadata groupsMetadata ,
136+ @ Nullable StringValueResolver valueResolver ) {
187137
188138 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
189139 context .registerBean (RestClientHttpServiceGroupConfigurer .class , () -> groupConfigurer );
@@ -192,6 +142,7 @@ private HttpServiceProxyRegistry initProxyRegistry(
192142 HttpServiceProxyRegistryFactoryBean factoryBean = new HttpServiceProxyRegistryFactoryBean (groupsMetadata );
193143 factoryBean .setApplicationContext (context );
194144 factoryBean .setBeanClassLoader (getClass ().getClassLoader ());
145+ factoryBean .setEmbeddedValueResolver (valueResolver );
195146 factoryBean .afterPropertiesSet ();
196147
197148 return factoryBean .getObject ();
@@ -226,7 +177,7 @@ public void withGroup(HttpServiceGroup group, RestClient clientBuilder, HttpServ
226177 @ HttpExchange (url = "${test.base.url}" )
227178 interface PlaceholderService {
228179
229- @ GetExchange ( "/endpoint" )
230- String callEndpoint ();
180+ @ GetExchange
181+ String invoke ();
231182 }
232183}
0 commit comments