Skip to content

Commit 8a91762

Browse files
authored
Merge pull request #19 from meysamzamani/EPNG-11961-migrate-spring-boot-readiness-to-spring-boot-3
EPNG-11961: Migrate to Spring Boot 3.3.x and JUnit 5
2 parents 1e32a78 + f30aede commit 8a91762

File tree

10 files changed

+95
-76
lines changed

10 files changed

+95
-76
lines changed

build.gradle

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildscript {
22
ext {
3-
springBootVersion = '2.7.18'
3+
springBootVersion = '3.3.13'
44
}
55
repositories {
66
mavenCentral()
@@ -34,17 +34,14 @@ dependencies {
3434
implementation('org.springframework.boot:spring-boot-starter-actuator')
3535
implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
3636
implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-yaml')
37-
implementation('org.apache.httpcomponents:httpclient')
37+
implementation('org.apache.httpcomponents.client5:httpclient5')
3838
implementation('org.springframework.data:spring-data-commons')
3939

4040
compileOnly('org.projectlombok:lombok')
4141
runtimeOnly('org.webjars:webjars-locator-core')
42-
runtimeOnly('org.webjars:bootstrap:5.3.3')
42+
runtimeOnly('org.webjars:bootstrap:5.3.7')
4343
runtimeOnly('org.springframework.boot:spring-boot-devtools')
4444

45-
testImplementation('junit:junit')
46-
testImplementation('org.assertj:assertj-core')
47-
testImplementation('org.mockito:mockito-core')
4845
testImplementation('org.springframework.boot:spring-boot-starter-test')
4946
testCompileOnly('org.projectlombok:lombok')
5047

@@ -55,3 +52,7 @@ dependencies {
5552
bootRun {
5653
systemProperties System.properties
5754
}
55+
56+
test {
57+
useJUnitPlatform()
58+
}

src/main/java/com/epages/readiness/RestTemplateConfiguration.java

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
import javax.net.ssl.SSLContext;
77

8-
import org.apache.http.client.HttpClient;
9-
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
10-
import org.apache.http.impl.client.HttpClientBuilder;
11-
import org.apache.http.impl.client.HttpClients;
12-
import org.apache.http.ssl.SSLContexts;
13-
import org.apache.http.ssl.TrustStrategy;
8+
import org.apache.hc.client5.http.classic.HttpClient;
9+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
10+
import org.apache.hc.client5.http.impl.classic.HttpClients;
11+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
12+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
13+
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
14+
import org.apache.hc.core5.ssl.SSLContexts;
15+
import org.apache.hc.core5.ssl.TrustStrategy;
1416
import org.springframework.beans.factory.annotation.Value;
1517
import org.springframework.context.annotation.Bean;
1618
import org.springframework.context.annotation.Configuration;
@@ -36,9 +38,13 @@ public HttpClient insecureHttpClient(@Value("${spring.application.name}") String
3638
// http://stackoverflow.com/a/41618092/1393467
3739
TrustStrategy trustStrategy = (X509Certificate[] chain, String authType) -> true;
3840
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, trustStrategy).build();
39-
return configure(HttpClients.custom(), userAgent)
40-
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))
41-
.build();
41+
42+
return configure(
43+
HttpClients.custom(),
44+
userAgent,
45+
SSLConnectionSocketFactoryBuilder.create()
46+
.setSslContext(sslContext).build()
47+
).build();
4248
}
4349

4450
@Bean("httpClient")
@@ -48,18 +54,29 @@ public HttpClient secureHttpClient(@Value("${spring.application.name}") String u
4854
}
4955

5056
private HttpClientBuilder configure(HttpClientBuilder builder, String userAgent) {
57+
return configure(builder, userAgent, null);
58+
}
59+
60+
private HttpClientBuilder configure(HttpClientBuilder builder, String userAgent, SSLConnectionSocketFactory sslSocketFactory) {
61+
62+
PoolingHttpClientConnectionManagerBuilder connectionManagerBuilder = PoolingHttpClientConnectionManagerBuilder.create()
63+
.setMaxConnTotal(settings.getServices().size())
64+
.setMaxConnPerRoute(settings.getServices().size());
65+
66+
if (sslSocketFactory != null) {
67+
connectionManagerBuilder.setSSLSocketFactory(sslSocketFactory);
68+
}
69+
5170
return builder
5271
.setUserAgent(userAgent)
5372
.disableAutomaticRetries()
54-
.setMaxConnTotal(settings.getServices().size())
55-
.setMaxConnPerRoute(settings.getServices().size());
73+
.setConnectionManager(connectionManagerBuilder.build());
5674
}
5775

5876
@Bean
5977
public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
6078
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
6179
factory.setConnectTimeout(settings.getConnectionTimeout());
62-
factory.setReadTimeout(settings.getReadTimeout());
6380
factory.setConnectionRequestTimeout(settings.getConnectionRequestTimeout());
6481
return factory;
6582
}

src/test/java/com/epages/readiness/CommandLineRunnerTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package com.epages.readiness;
22

3-
import org.junit.Test;
4-
import org.junit.runner.RunWith;
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.ExtendWith;
55
import org.springframework.beans.factory.InitializingBean;
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.boot.CommandLineRunner;
88
import org.springframework.boot.test.context.TestConfiguration;
99
import org.springframework.boot.test.mock.mockito.MockBean;
10-
import org.springframework.test.context.junit4.SpringRunner;
10+
import org.springframework.test.context.junit.jupiter.SpringExtension;
1111

1212
import static org.assertj.core.api.BDDAssertions.then;
1313
import static org.mockito.BDDMockito.willReturn;
1414
import static org.mockito.Mockito.verify;
1515

1616
@ReadinessApplicationTest(activeProfiles = {"test", "cli", "insecure"}, configurations = {ReadinessApplication.class, CommandLineRunnerTest.MockReadinessClientConfiguration.class})
17-
@RunWith(SpringRunner.class)
18-
public class CommandLineRunnerTest {
17+
@ExtendWith(SpringExtension.class)
18+
class CommandLineRunnerTest {
1919

2020
@Autowired(required = false)
2121
private CommandLineRunner commandLineRunner;
@@ -24,13 +24,13 @@ public class CommandLineRunnerTest {
2424
private ReadinessClient mockReadinessClient;
2525

2626
@Test
27-
public void should_create_command_line_runner() {
27+
void should_create_command_line_runner() {
2828
then(commandLineRunner).isNotNull();
2929
verify(mockReadinessClient).getReadiness();
3030
}
3131

3232
@TestConfiguration
33-
public static class MockReadinessClientConfiguration implements InitializingBean {
33+
static class MockReadinessClientConfiguration implements InitializingBean {
3434

3535
@MockBean
3636
private ReadinessClient mockReadinessClient;

src/test/java/com/epages/readiness/HealthClientTest.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,22 @@
88
import java.util.List;
99

1010
import java.util.Map;
11-
import org.junit.Rule;
12-
import org.junit.Test;
13-
import org.junit.runner.RunWith;
11+
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.ExtendWith;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
1415
import org.springframework.beans.factory.annotation.Autowired;
15-
import org.springframework.test.context.junit4.SpringRunner;
16+
import org.springframework.test.context.junit.jupiter.SpringExtension;
1617

1718
import com.epages.readiness.HealthResponse.ChildStatus;
1819

1920
@ReadinessApplicationTest
20-
@RunWith(SpringRunner.class)
21-
public class HealthClientTest {
21+
@ExtendWith(SpringExtension.class)
22+
class HealthClientTest {
2223

23-
@Rule
24+
@RegisterExtension
2425
@Autowired
25-
public MockRestTemplateRule mockRestTemplateRule;
26+
private MockRestTemplateExtension mockRestTemplateExtension;
2627

2728
@Autowired
2829
private ReadinessSettings settings;
@@ -31,9 +32,9 @@ public class HealthClientTest {
3132
private HealthClient healthClient;
3233

3334
@Test
34-
public void should_get_health() {
35+
void should_get_health() {
3536
// GIVEN
36-
HealthRequest request = settings.getServices().get(0);
37+
HealthRequest request = settings.getServices().getFirst();
3738

3839
// WHEN
3940
HealthResponse healthResponse = healthClient.getHealth(request);
@@ -43,11 +44,11 @@ public void should_get_health() {
4344
}
4445

4546
@Test
46-
public void should_get_children_status() {
47+
void should_get_children_status() {
4748
// GIVEN
4849
HealthResponse healthResponse = HealthResponse.builder()
4950
.status(DOWN)
50-
.request(settings.getServices().get(0))
51+
.request(settings.getServices().getFirst())
5152
.details(Map.of(
5253
"foo", Map.of("status", UP),
5354
"bar", Map.of("status", UNKNOWN)
@@ -65,7 +66,7 @@ public void should_get_children_status() {
6566
}
6667

6768
@Test
68-
public void should_handle_exception() {
69+
void should_handle_exception() {
6970
// GIVEN
7071
HealthRequest request = new HealthRequest("exception", "https://host.invalid/EXCEPTION");
7172

src/test/java/com/epages/readiness/HealthResponseTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
package com.epages.readiness;
22

3-
import static java.util.stream.Collectors.toList;
43
import static org.assertj.core.api.BDDAssertions.then;
54
import static org.springframework.boot.actuate.health.Status.UP;
65

7-
import org.junit.Test;
6+
import org.junit.jupiter.api.Test;
87

98
import com.fasterxml.jackson.databind.ObjectMapper;
109

1110
import lombok.SneakyThrows;
1211

13-
public class HealthResponseTest {
12+
class HealthResponseTest {
1413

1514
@Test
1615
@SneakyThrows
17-
public void should_deserialize_json() {
16+
void should_deserialize_json() {
1817
// GIVEN
1918
ObjectMapper objectMapper = new ObjectMapper();
2019
//language=JSON
@@ -50,7 +49,7 @@ public void should_deserialize_json() {
5049

5150
// THEN
5251
then(healthResponse.getStatus()).isEqualTo(UP);
53-
then(healthResponse.getChildrenStatus().stream().map(HealthResponse.ChildStatus::getName).collect(toList())).containsOnly("db", "hystrix", "rabbit", "refreshScope");
54-
then(healthResponse.getChildrenStatus().stream().map(s -> s.getStatus().getCode()).collect(toList())).containsOnly("UP", "UP", "UP", "UP");
52+
then(healthResponse.getChildrenStatus().stream().map(HealthResponse.ChildStatus::getName).toList()).containsOnly("db", "hystrix", "rabbit", "refreshScope");
53+
then(healthResponse.getChildrenStatus().stream().map(s -> s.getStatus().getCode()).toList()).containsOnly("UP", "UP", "UP", "UP");
5554
}
5655
}

src/test/java/com/epages/readiness/MockRestTemplateRule.java renamed to src/test/java/com/epages/readiness/MockRestTemplateExtension.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,22 @@
55

66
import java.net.URI;
77

8-
import org.junit.rules.ExternalResource;
8+
import org.junit.jupiter.api.extension.BeforeEachCallback;
9+
import org.junit.jupiter.api.extension.ExtensionContext;
910
import org.springframework.stereotype.Component;
1011
import org.springframework.web.client.RestTemplate;
1112

1213
import lombok.RequiredArgsConstructor;
1314

1415
@Component
1516
@RequiredArgsConstructor
16-
public class MockRestTemplateRule extends ExternalResource {
17+
public class MockRestTemplateExtension implements BeforeEachCallback {
1718

1819
private final RestTemplate mockRestTemplate;
1920

2021
@Override
21-
protected void before() {
22+
public void beforeEach(ExtensionContext context) {
2223
willAnswer(new MockRestTemplateAnswer()).given(mockRestTemplate).getForObject(any(URI.class), any());
2324
}
25+
2426
}

src/test/java/com/epages/readiness/ReadinessClientTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
import static org.assertj.core.api.BDDAssertions.then;
44
import static org.springframework.boot.actuate.health.Status.DOWN;
55

6-
import org.junit.Rule;
7-
import org.junit.Test;
8-
import org.junit.runner.RunWith;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
99
import org.springframework.beans.factory.annotation.Autowired;
10-
import org.springframework.test.context.junit4.SpringRunner;
10+
import org.springframework.test.context.junit.jupiter.SpringExtension;
1111

1212
@ReadinessApplicationTest
13-
@RunWith(SpringRunner.class)
14-
public class ReadinessClientTest {
13+
@ExtendWith(SpringExtension.class)
14+
class ReadinessClientTest {
1515

16-
@Rule
16+
@RegisterExtension
1717
@Autowired
18-
public MockRestTemplateRule mockRestTemplateRule;
18+
private MockRestTemplateExtension mockRestTemplateExtension;
1919

2020
@Autowired
2121
private ReadinessClient readinessClient;
@@ -24,7 +24,7 @@ public class ReadinessClientTest {
2424
private ReadinessSettings settings;
2525

2626
@Test
27-
public void should_retrieve_health_checks() {
27+
void should_retrieve_health_checks() {
2828
// WHEN
2929
ReadinessResponse response = readinessClient.getReadiness();
3030

src/test/java/com/epages/readiness/ReadinessControllerTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.epages.readiness;
22

3-
import org.junit.Test;
4-
import org.junit.runner.RunWith;
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.ExtendWith;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
77
import org.springframework.boot.test.mock.mockito.MockBean;
88
import org.springframework.test.context.ActiveProfiles;
9-
import org.springframework.test.context.junit4.SpringRunner;
9+
import org.springframework.test.context.junit.jupiter.SpringExtension;
1010
import org.springframework.test.web.servlet.MockMvc;
1111
import org.springframework.test.web.servlet.ResultActions;
1212

@@ -23,8 +23,8 @@
2323

2424
@WebMvcTest(ReadinessController.class)
2525
@ActiveProfiles({"test", "dashboard"})
26-
@RunWith(SpringRunner.class)
27-
public class ReadinessControllerTest {
26+
@ExtendWith(SpringExtension.class)
27+
class ReadinessControllerTest {
2828

2929
@MockBean
3030
private ReadinessClient mockReadinessClient;
@@ -34,7 +34,7 @@ public class ReadinessControllerTest {
3434

3535
@Test
3636
@SneakyThrows
37-
public void should_render_dashboard_using_custom_sorting() {
37+
void should_render_dashboard_using_custom_sorting() {
3838
// GIVEN
3939
givenReadinessResponse();
4040

@@ -53,7 +53,7 @@ public void should_render_dashboard_using_custom_sorting() {
5353

5454
@Test
5555
@SneakyThrows
56-
public void should_render_dashboard_using_default_sorting() {
56+
void should_render_dashboard_using_default_sorting() {
5757
// GIVEN
5858
givenReadinessResponse();
5959

src/test/java/com/epages/readiness/ReadinessResponseTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,24 @@
66
import static org.springframework.boot.actuate.health.Status.UNKNOWN;
77
import static org.springframework.boot.actuate.health.Status.UP;
88

9-
import java.util.List;
10-
import org.junit.Before;
11-
import org.junit.Test;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
1211
import org.springframework.boot.actuate.health.SimpleStatusAggregator;
1312
import org.springframework.boot.actuate.health.Status;
1413

15-
public class ReadinessResponseTest {
14+
class ReadinessResponseTest {
1615

1716
private SimpleStatusAggregator healthAggregator;
1817

19-
@Before
20-
public void setup() {
18+
@BeforeEach
19+
void setup() {
2120
healthAggregator = new SimpleStatusAggregator(
2221
DOWN, OUT_OF_SERVICE, UNKNOWN, new Status("DEGRADED"), UP
2322
);
2423
}
2524

2625
@Test
27-
public void should_handle_degraded() {
26+
void should_handle_degraded() {
2827
// GIVEN
2928
HealthResponse up = HealthResponse.builder()
3029
.request(new HealthRequest("A", "http://a"))

0 commit comments

Comments
 (0)