Skip to content

Commit 7bd0f3c

Browse files
author
Gennady Kuzmin
committed
redo RedirectLBToEmbeddedWebServer
1 parent 24f948d commit 7bd0f3c

File tree

10 files changed

+99
-89
lines changed

10 files changed

+99
-89
lines changed

spring-test-web/src/main/java/com/jupiter/tools/spring/test/web/annotation/EnableRestMvcTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.jupiter.tools.spring.test.core.annotation.EnableIntegrationTest;
44
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
5+
import org.springframework.boot.test.context.SpringBootTest;
56

67
import java.lang.annotation.ElementType;
78
import java.lang.annotation.Retention;
@@ -26,4 +27,5 @@
2627
@EnableIntegrationTest
2728
@AutoConfigureMockMvc
2829
public @interface EnableRestMvcTest {
30+
SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.RANDOM_PORT;
2931
}

spring-test-web/src/main/java/com/jupiter/tools/spring/test/web/annotation/EnableRestTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@
1111

1212
@Retention(RetentionPolicy.RUNTIME)
1313
@Target(ElementType.TYPE)
14-
@SpringBootTest
1514
@AutoConfigureWebTestClient
1615
@EnableIntegrationTest
1716
public @interface EnableRestTest {
18-
SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.MOCK;
17+
SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.RANDOM_PORT;
1918
}

spring-test-web/src/main/java/com/jupiter/tools/spring/test/web/extension/ribbon/JupiterToolsDiscoveryClient.java

Lines changed: 0 additions & 61 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.jupiter.tools.spring.test.web.extension.ribbon;
2+
3+
import org.springframework.cloud.client.DefaultServiceInstance;
4+
import org.springframework.cloud.client.ServiceInstance;
5+
import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties;
6+
import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer;
7+
import org.springframework.cloud.context.named.NamedContextFactory;
8+
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration;
9+
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientSpecification;
10+
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
11+
import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers;
12+
import org.springframework.core.env.Environment;
13+
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
import static org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory.NAMESPACE;
18+
import static org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory.PROPERTY_NAME;
19+
20+
/**
21+
* @author Gennady Kuzmin
22+
*/
23+
public class LocalHostLoadBalancerClientFactory extends NamedContextFactory<LoadBalancerClientSpecification>
24+
implements ReactiveLoadBalancer.Factory<ServiceInstance> {
25+
26+
private final Map<String, ServiceInstance> instances = new HashMap<>();
27+
private final Environment environment;
28+
29+
public LocalHostLoadBalancerClientFactory(Environment environment) {
30+
super(LoadBalancerClientConfiguration.class, NAMESPACE, PROPERTY_NAME);
31+
32+
this.environment = environment;
33+
}
34+
35+
@Override
36+
public LoadBalancerProperties getProperties(String serviceId) {
37+
return new LoadBalancerProperties();
38+
}
39+
40+
@Override
41+
public ReactiveLoadBalancer<ServiceInstance> getInstance(String serviceId) {
42+
ServiceInstance serviceInstance = instances.isEmpty() ?
43+
toServiceInstances(serviceId) :
44+
instances.get(serviceId);
45+
46+
return new RoundRobinLoadBalancer(ServiceInstanceListSuppliers.toProvider(serviceId, serviceInstance), serviceId);
47+
}
48+
49+
private ServiceInstance toServiceInstances(String serviceId) {
50+
int port = environment.getProperty("local.server.port", Integer.class);
51+
return new DefaultServiceInstance(serviceId, serviceId, "127.0.0.1", port, false);
52+
}
53+
54+
public void clearInstances() {
55+
instances.clear();
56+
}
57+
58+
public void addInstances(String... serviceIds) {
59+
for (String serviceId : serviceIds) {
60+
instances.put(serviceId, toServiceInstances(serviceId));
61+
}
62+
}
63+
}

spring-test-web/src/main/java/com/jupiter/tools/spring/test/web/extension/ribbon/RedirectLBExtension.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,33 @@
44
import org.junit.jupiter.api.extension.BeforeEachCallback;
55
import org.junit.jupiter.api.extension.Extension;
66
import org.junit.jupiter.api.extension.ExtensionContext;
7+
import org.springframework.test.context.junit.jupiter.SpringExtension;
78

89
/**
910
* Created on 05.02.2019.
1011
*
1112
* @author Korovin Anatoliy
13+
* @author Gennady Kuzmin
1214
*/
1315
public class RedirectLBExtension implements Extension, BeforeEachCallback, AfterAllCallback {
1416

1517
@Override
1618
public void beforeEach(ExtensionContext context) throws Exception {
17-
RedirectLBExtensionConfig.setClients(getClientNameFromTestClass(context));
19+
getLoadBalancerClientFactory(context).addInstances(getClientNameFromTestClass(context));
1820
}
1921

2022
@Override
2123
public void afterAll(ExtensionContext context) throws Exception {
22-
RedirectLBExtensionConfig.clearClients();
24+
getLoadBalancerClientFactory(context).clearInstances();
25+
}
26+
27+
private LocalHostLoadBalancerClientFactory getLoadBalancerClientFactory(ExtensionContext context) {
28+
return SpringExtension.getApplicationContext(context).getBean(LocalHostLoadBalancerClientFactory.class);
2329
}
2430

2531
private String[] getClientNameFromTestClass(ExtensionContext context) {
2632
return context.getRequiredTestClass()
27-
.getAnnotation(RedirectLBToEmbeddedWebServer.class)
33+
.getAnnotation(RedirectLBToLocalHost.class)
2834
.value();
2935
}
3036
}
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
package com.jupiter.tools.spring.test.web.extension.ribbon;
22

3+
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
4+
import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient;
35
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Primary;
8+
import org.springframework.core.env.Environment;
49

510
/**
611
* Created on 06.02.2019.
712
*
813
* @author Korovin Anatoliy
14+
* @author Gennady Kuzmin
915
*/
16+
@Configuration
1017
public class RedirectLBExtensionConfig {
1118

12-
private final static JupiterToolsDiscoveryClient JUPITER_TOOLS_DISCOVERY_CLIENT = new JupiterToolsDiscoveryClient();
13-
1419
@Bean
15-
public JupiterToolsDiscoveryClient customDiscoveryClient() {
16-
return JUPITER_TOOLS_DISCOVERY_CLIENT;
17-
}
18-
19-
public static void clearClients() {
20-
JUPITER_TOOLS_DISCOVERY_CLIENT.clearInstances();
20+
@Primary
21+
public LocalHostLoadBalancerClientFactory jupiterToolsLoadBalancerClientFactory(Environment environment) {
22+
return new LocalHostLoadBalancerClientFactory(environment);
2123
}
2224

23-
public static void setClients(String... clients) {
24-
for (String client : clients) {
25-
JUPITER_TOOLS_DISCOVERY_CLIENT.addInstances(client);
26-
}
25+
@Bean
26+
public LoadBalancerClient blockingLoadBalancerClient(LocalHostLoadBalancerClientFactory loadBalancerClientFactory) {
27+
return new BlockingLoadBalancerClient(loadBalancerClientFactory);
2728
}
2829
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
@Retention(RetentionPolicy.RUNTIME)
1818
@ExtendWith(RedirectLBExtension.class)
1919
@Import(RedirectLBExtensionConfig.class)
20-
public @interface RedirectLBToEmbeddedWebServer {
20+
public @interface RedirectLBToLocalHost {
2121

2222
/**
2323
* @return List of client names which should be redirected to the embedded web server

spring-test-web/src/test/java/com/jupiter/tools/spring/test/web/extension/ribbon/RedirectLBExtensionByFeignTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.jupiter.tools.spring.test.web.extension.ribbon;
22

3-
import com.jupiter.tools.spring.test.web.annotation.EnableEmbeddedWebServerTest;
43
import feign.Client;
54
import feign.Feign;
65
import org.junit.jupiter.api.Test;
76
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.test.context.SpringBootTest;
88
import org.springframework.boot.test.context.TestConfiguration;
99
import org.springframework.cloud.openfeign.support.SpringMvcContract;
1010
import org.springframework.context.annotation.Bean;
@@ -19,8 +19,8 @@
1919
*
2020
* @author Korovin Anatoliy
2121
*/
22-
@EnableEmbeddedWebServerTest
23-
@RedirectLBToEmbeddedWebServer("test-service")
22+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
23+
@RedirectLBToLocalHost("test-service")
2424
class RedirectLBExtensionByFeignTest {
2525

2626
@Autowired

spring-test-web/src/test/java/com/jupiter/tools/spring/test/web/extension/ribbon/RedirectLBExtensionTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.jupiter.tools.spring.test.web.extension.ribbon;
22

3-
import com.jupiter.tools.spring.test.web.annotation.EnableEmbeddedWebServerTest;
43
import org.junit.jupiter.api.Assertions;
54
import org.junit.jupiter.api.Test;
65
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.test.context.SpringBootTest;
77
import org.springframework.boot.test.context.TestConfiguration;
88
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
99
import org.springframework.context.annotation.Bean;
@@ -23,8 +23,8 @@
2323
*
2424
* @author Korovin Anatoliy
2525
*/
26-
@EnableEmbeddedWebServerTest
27-
@RedirectLBToEmbeddedWebServer("test-service")
26+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
27+
@RedirectLBToLocalHost("test-service")
2828
class RedirectLBExtensionTest {
2929

3030
@Autowired
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.jupiter.tools.spring.test.web.extension.ribbon;
22

3-
import com.jupiter.tools.spring.test.web.annotation.EnableEmbeddedWebServerTest;
43
import org.junit.jupiter.api.Test;
54
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.test.context.SpringBootTest;
66
import org.springframework.boot.test.context.TestConfiguration;
77
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
88
import org.springframework.context.annotation.Bean;
@@ -22,9 +22,9 @@
2222
*
2323
* @author Korovin Anatoliy
2424
*/
25-
@EnableEmbeddedWebServerTest
26-
@RedirectLBToEmbeddedWebServer
27-
class RedirectLBToEmbeddedWebServerTest {
25+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
26+
@RedirectLBToLocalHost
27+
class RedirectLBToLocalHostTest {
2828

2929
@Autowired
3030
private RestTemplate restTemplate;

0 commit comments

Comments
 (0)