From be282baf886c6fc39a0e12c23f6a468c5f7c9f41 Mon Sep 17 00:00:00 2001 From: Russell Dodd Date: Tue, 31 Mar 2026 13:18:55 +0100 Subject: [PATCH] Upgrade to Spring Boot v4 --- build.gradle | 41 +++++++------------ .../controllers/SampleFunctionalTest.java | 39 ------------------ .../controllers/SampleSmokeTest.java | 37 ----------------- .../logging/EventLoggingServiceTest.java | 6 +-- 4 files changed, 17 insertions(+), 106 deletions(-) delete mode 100644 src/functionalTest/java/uk/gov/hmcts/commonlib/controllers/SampleFunctionalTest.java delete mode 100644 src/smokeTest/java/uk/gov/hmcts/commonlib/controllers/SampleSmokeTest.java diff --git a/build.gradle b/build.gradle index 148ccdc..7420216 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ plugins { } group = 'uk.gov.hmcts' -version = '0.2.7' +version = '0.3.0' java { toolchain { @@ -130,49 +130,40 @@ repositories { } ext { - log4JVersion = "2.25.3" - logbackVersion = "1.5.32" + jacksonVersion = "2.21.2" lombokVersion = "1.18.44" mapstructVersion = "1.6.3" - springVersion = "3.5.13" + springVersion = "4.0.5" } ext['snakeyaml.version'] = '2.0' dependencyManagement { imports { - mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.13' + mavenBom "com.fasterxml.jackson:jackson-bom:${jacksonVersion}" + mavenBom 'org.springframework.boot:spring-boot-dependencies:4.0.5' mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2025.1.1' } } dependencies { - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springVersion - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: springVersion - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: springVersion - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-json', version: springVersion - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-oauth2-resource-server', version: springVersion + implementation 'org.springframework.boot:spring-boot' + implementation 'org.springframework:spring-context' + implementation 'org.springframework:spring-web' + implementation 'jakarta.servlet:jakarta.servlet-api' + implementation 'org.springframework.security:spring-security-web' + implementation 'org.springframework.security:spring-security-oauth2-jose' + implementation 'org.springframework.security:spring-security-oauth2-resource-server' + implementation 'com.fasterxml.jackson.core:jackson-databind' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:5.0.1', { exclude group: 'commons-fileupload', module: 'commons-fileupload' } - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.2',{ - exclude group: 'org.springframework.boot', module: 'spring-boot-jackson' - exclude group: 'org.springframework.boot', module: 'spring-boot-webmvc' - exclude group: 'org.springframework.boot', module: 'spring-boot-web-server' - exclude group: 'org.springframework.boot', module: 'spring-boot-validation' - exclude group: 'org.hibernate.validator', module: 'hibernate-validator' // Excluded for CVE-2025-15104 - } implementation 'org.hibernate.validator:hibernate-validator:9.1.0.Final' // CVE-2025-15104 not yet fixed, so suppressed in owasp file - implementation group: 'com.github.hmcts.java-logging', name: 'logging', version: '8.0.0' - implementation 'com.microsoft.azure:applicationinsights-spring-boot-starter:2.6.4' - - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: log4JVersion - implementation group: 'org.apache.logging.log4j', name: 'log4j-to-slf4j', version: log4JVersion - implementation group: 'ch.qos.logback', name: 'logback-classic', version: logbackVersion - implementation group: 'ch.qos.logback', name: 'logback-core', version: logbackVersion implementation group: 'org.mapstruct', name: 'mapstruct', version: mapstructVersion + runtimeOnly 'org.apache.tomcat.embed:tomcat-embed-el' compileOnly "org.projectlombok:lombok:${lombokVersion}" annotationProcessor "org.projectlombok:lombok:${lombokVersion}" @@ -195,9 +186,7 @@ dependencies { smokeTestAnnotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springVersion - testImplementation group: 'io.rest-assured', name: 'rest-assured', version: '6.0.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - testImplementation 'javax.servlet:javax.servlet-api:4.0.1' } diff --git a/src/functionalTest/java/uk/gov/hmcts/commonlib/controllers/SampleFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/commonlib/controllers/SampleFunctionalTest.java deleted file mode 100644 index 9e4dedb..0000000 --- a/src/functionalTest/java/uk/gov/hmcts/commonlib/controllers/SampleFunctionalTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package uk.gov.hmcts.commonlib.controllers; - -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import io.restassured.response.Response; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; - -import static io.restassured.RestAssured.given; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -class SampleFunctionalTest { - protected static final String CONTENT_TYPE_VALUE = "application/json"; - - @Value("${TEST_URL:http://localhost:8080}") - private String testUrl; - - @BeforeEach - public void setUp() { - RestAssured.baseURI = testUrl; - RestAssured.useRelaxedHTTPSValidation(); - } - - @Test - void functionalTest() { - Response response = given() - .contentType(ContentType.JSON) - .when() - .get() - .then() - .extract().response(); - - Assertions.assertEquals(200, response.statusCode()); - Assertions.assertTrue(response.asString().startsWith("Welcome")); - } -} diff --git a/src/smokeTest/java/uk/gov/hmcts/commonlib/controllers/SampleSmokeTest.java b/src/smokeTest/java/uk/gov/hmcts/commonlib/controllers/SampleSmokeTest.java deleted file mode 100644 index 85faff9..0000000 --- a/src/smokeTest/java/uk/gov/hmcts/commonlib/controllers/SampleSmokeTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package uk.gov.hmcts.commonlib.controllers; - -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import io.restassured.response.Response; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; - -import static io.restassured.RestAssured.given; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -class SampleSmokeTest { - @Value("${TEST_URL:http://localhost:4550}") - private String testUrl; - - @BeforeEach - public void setUp() { - RestAssured.useRelaxedHTTPSValidation(); - } - - @Test - void smokeTest() { - Response response = given() - .baseUri(testUrl) - .contentType(ContentType.JSON) - .when() - .get() - .then() - .extract().response(); - - Assertions.assertEquals(200, response.statusCode()); - Assertions.assertTrue(response.asString().startsWith("Welcome")); - } -} diff --git a/src/test/java/uk/gov/hmcts/opal/common/logging/EventLoggingServiceTest.java b/src/test/java/uk/gov/hmcts/opal/common/logging/EventLoggingServiceTest.java index f19f9f2..d6eedcb 100644 --- a/src/test/java/uk/gov/hmcts/opal/common/logging/EventLoggingServiceTest.java +++ b/src/test/java/uk/gov/hmcts/opal/common/logging/EventLoggingServiceTest.java @@ -33,7 +33,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -57,9 +56,6 @@ class EventLoggingServiceTest { @MockitoBean private Appender mockAppender; - @Captor - private ArgumentCaptor captor; - @Autowired private SecurityEventLoggingService service; @@ -135,6 +131,7 @@ void logEvent_minimalParams() { service.logEvent("TestEvent", "Success", null, "TestType",null, null); // Assert + ArgumentCaptor captor = ArgumentCaptor.forClass(ILoggingEvent.class); verify(mockAppender, atLeastOnce()).doAppend(captor.capture()); List events = captor.getAllValues(); String nowText = now.toString(); @@ -162,6 +159,7 @@ void logEvent_populatedParams() { service.logEvent("TestEvent", "Success", buid, "TestType",opTimestamp, data); // Assert + ArgumentCaptor captor = ArgumentCaptor.forClass(ILoggingEvent.class); verify(mockAppender, atLeastOnce()).doAppend(captor.capture()); List events = captor.getAllValues(); String nowText = now.toString();