diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 1a3a8c41..6e60ef81 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -35,10 +35,15 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-starter-webmvc-test
+ test
+
- org.springframework.security
- spring-security-test
+ org.springframework.boot
+ spring-boot-starter-security-test
test
diff --git a/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java b/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java
index e266e334..936c9802 100644
--- a/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java
+++ b/integration-tests/src/test/java/my/bookshop/it/FeatureTogglesIT.java
@@ -7,8 +7,8 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
diff --git a/pom.xml b/pom.xml
index 7456aae1..7890b18d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.5.14
+ 4.1.0
@@ -28,9 +28,9 @@
25
- 4.9.0
+ 5.0.0-m2624
5.30.0
- 3.7.3
+ 4.0.0
4.2.0
1.5.0
diff --git a/srv/pom.xml b/srv/pom.xml
index eca15c24..b05e2411 100644
--- a/srv/pom.xml
+++ b/srv/pom.xml
@@ -110,6 +110,11 @@
spring-boot-starter-security
+
+ org.springframework.boot
+ spring-boot-starter-security-oauth2-resource-server
+
+
org.springframework.boot
spring-boot-starter-actuator
@@ -122,14 +127,26 @@
- org.springframework.security
- spring-security-test
+ org.springframework.boot
+ spring-boot-starter-security-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webclient
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-webtestclient
test
org.springframework.boot
- spring-boot-starter-webflux
+ spring-boot-starter-webmvc-test
test
diff --git a/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java b/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java
index 4ecd1295..c8abcec6 100644
--- a/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java
+++ b/srv/src/main/java/my/bookshop/health/CustomHealthIndicator.java
@@ -1,8 +1,8 @@
package my.bookshop.health;
-import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.HealthIndicator;
+import org.springframework.boot.health.autoconfigure.contributor.ConditionalOnEnabledHealthIndicator;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.contributor.HealthIndicator;
import org.springframework.stereotype.Component;
/** Custom health indicator implementation. */
diff --git a/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java b/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java
index 63eef15f..90f4a4b9 100644
--- a/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java
+++ b/srv/src/test/java/my/bookshop/AdminServiceAddress_default_ITest.java
@@ -3,6 +3,7 @@
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.test.context.ActiveProfiles;
/**
@@ -12,6 +13,7 @@
*/
@ActiveProfiles("default")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@AutoConfigureWebTestClient
class AdminServiceAddress_default_ITest extends AdminServiceAddressITestBase {
@Test
diff --git a/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java b/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java
index bd43bb1b..c2f63def 100644
--- a/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java
+++ b/srv/src/test/java/my/bookshop/AdminServiceAddress_mocked_ITest.java
@@ -3,6 +3,7 @@
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.test.context.ActiveProfiles;
/**
@@ -16,6 +17,7 @@
webEnvironment = WebEnvironment.RANDOM_PORT,
properties =
"cds.remote.services.'[API_BUSINESS_PARTNER]'.destination.name=myself-AdminServiceAddressITest")
+@AutoConfigureWebTestClient
class AdminServiceAddress_mocked_ITest extends AdminServiceAddressITestBase {
@Test
diff --git a/srv/src/test/java/my/bookshop/CatalogServiceITest.java b/srv/src/test/java/my/bookshop/CatalogServiceITest.java
index ee71ea3e..0902d7ee 100644
--- a/srv/src/test/java/my/bookshop/CatalogServiceITest.java
+++ b/srv/src/test/java/my/bookshop/CatalogServiceITest.java
@@ -1,12 +1,7 @@
package my.bookshop;
import static cds.gen.catalogservice.CatalogService_.REVIEWS;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.assertj.core.api.Assertions.assertThat;
import cds.gen.catalogservice.Reviews;
import com.sap.cds.ql.Delete;
@@ -14,14 +9,14 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
-import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.client.RestTestClient;
@SpringBootTest
-@AutoConfigureMockMvc
+@AutoConfigureRestTestClient
class CatalogServiceITest {
private static final String booksURI = "/api/browse/Books";
@@ -32,7 +27,7 @@ class CatalogServiceITest {
private static final String USER_USER_STRING = "user";
private static final String ADMIN_USER_STRING = "admin";
- @Autowired private MockMvc mockMvc;
+ @Autowired private RestTestClient client;
@Autowired private PersistenceService db;
@@ -42,47 +37,76 @@ void cleanup() {
}
@Test
- void discountApplied() throws Exception {
- mockMvc
- .perform(get(booksURI + "?$filter=stock gt 200&top=1"))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.value[0].title").value(containsString("11% discount")));
+ void discountApplied() {
+ client
+ .get()
+ .uri(booksURI + "?$filter=stock gt 200&top=1")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody()
+ .jsonPath("$.value[0].title")
+ .value(String.class, title -> assertThat(title).contains("11% discount"));
}
@Test
- void discountNotApplied() throws Exception {
- mockMvc
- .perform(get(booksURI + "?$filter=stock lt 100&top=1"))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.value[0].title").value(not(containsString("11% discount"))));
+ void discountNotApplied() {
+ client
+ .get()
+ .uri(booksURI + "?$filter=stock lt 100&top=1")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody()
+ .jsonPath("$.value[0].title")
+ .value(String.class, title -> assertThat(title).doesNotContain("11% discount"));
}
@Test
- void createReviewNotAuthenticated() throws Exception {
+ void createReviewNotAuthenticated() {
String payload = createTestReview().toJson();
- mockMvc
- .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload))
- .andExpect(status().isUnauthorized());
+ client
+ .post()
+ .uri(addReviewURI)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(payload)
+ .exchange()
+ .expectStatus()
+ .isUnauthorized();
}
@Test
@WithMockUser(USER_USER_STRING)
- void createReviewByUser() throws Exception {
+ void createReviewByUser() {
String payload = createTestReview().toJson();
- mockMvc
- .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.createdBy").value(USER_USER_STRING));
+ client
+ .post()
+ .uri(addReviewURI)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(payload)
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody()
+ .jsonPath("$.createdBy")
+ .isEqualTo(USER_USER_STRING);
}
@Test
@WithMockUser(ADMIN_USER_STRING)
- void createReviewByAdmin() throws Exception {
+ void createReviewByAdmin() {
String payload = createTestReview().toJson();
- mockMvc
- .perform(post(addReviewURI).contentType(MediaType.APPLICATION_JSON).content(payload))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.createdBy").value(ADMIN_USER_STRING));
+ client
+ .post()
+ .uri(addReviewURI)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(payload)
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody()
+ .jsonPath("$.createdBy")
+ .isEqualTo(ADMIN_USER_STRING);
}
private Reviews createTestReview() {
diff --git a/srv/src/test/java/my/bookshop/GenreHierarchyTest.java b/srv/src/test/java/my/bookshop/GenreHierarchyTest.java
index d01f82ea..cb855973 100644
--- a/srv/src/test/java/my/bookshop/GenreHierarchyTest.java
+++ b/srv/src/test/java/my/bookshop/GenreHierarchyTest.java
@@ -7,8 +7,8 @@
import java.net.URI;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.util.UriComponentsBuilder;
diff --git a/srv/src/test/java/my/bookshop/NotesServiceITest.java b/srv/src/test/java/my/bookshop/NotesServiceITest.java
index cc6c68b2..b4179bf9 100644
--- a/srv/src/test/java/my/bookshop/NotesServiceITest.java
+++ b/srv/src/test/java/my/bookshop/NotesServiceITest.java
@@ -4,6 +4,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.reactive.server.WebTestClient;
@@ -12,6 +13,7 @@
webEnvironment = WebEnvironment.RANDOM_PORT,
properties =
"cds.remote.services.'[API_BUSINESS_PARTNER]'.destination.name=myself-NotesServiceITest")
+@AutoConfigureWebTestClient
@ActiveProfiles({"default", "mocked"})
class NotesServiceITest {