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/mtx/sidecar/package.json b/mtx/sidecar/package.json index 7b51ce3f..57a56a9e 100644 --- a/mtx/sidecar/package.json +++ b/mtx/sidecar/package.json @@ -2,7 +2,7 @@ "dependencies": { "@cap-js/hana": "^2.8.0", "@sap/cds": "^9.9.1", - "@sap/cds-mtxs": "^3", + "@sap/cds-mtxs": "^3.9.4", "@sap/xssec": "^4.13.0", "express": "^4.22.2" }, diff --git a/package-lock.json b/package-lock.json index 99270163..e32166ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,14 +13,14 @@ "devDependencies": { "@sap/cds-compiler": "^6.9.3", "@sap/cds-dk": "9.9.2", - "@sap/cds-mtxs": "^3" + "@sap/cds-mtxs": "^3.9.4" } }, "mtx/sidecar": { "dependencies": { "@cap-js/hana": "^2.8.0", "@sap/cds": "^9.9.1", - "@sap/cds-mtxs": "^3", + "@sap/cds-mtxs": "^3.9.4", "@sap/xssec": "^4.13.0", "express": "^4.22.2" }, @@ -2080,10 +2080,10 @@ } }, "node_modules/@sap/hdi": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@sap/hdi/-/hdi-4.8.0.tgz", - "integrity": "sha512-tkJmY2ffm6mt4/LFwRBihlQkMxNAXa3ngvRe2N/6+qLIsUNdrH/M03S5mkygXq56K+KoVVZYuradajCusMWwsw==", - "license": "See LICENSE file", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@sap/hdi/-/hdi-4.8.1.tgz", + "integrity": "sha512-LfRtIbtfvMl82a8CwpqPJRRB9hRSVUQyvxualYBEzyNu/phuw6bFGQA5LHVngHsms+y797Icm4tl4X+TEkTtlg==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "async": "^3.2.3" }, @@ -2104,16 +2104,16 @@ } }, "node_modules/@sap/hdi-deploy": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@sap/hdi-deploy/-/hdi-deploy-5.6.1.tgz", - "integrity": "sha512-+qQ7qwG8lko303L5yRj2dud/nDAVuVblV/mmzJT44oPbF0Nry18eD2LUS23hFeuxjRa7rYK5YKQ8ffGgWxVrYQ==", - "license": "See LICENSE file", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@sap/hdi-deploy/-/hdi-deploy-5.7.0.tgz", + "integrity": "sha512-ENBCtCBnJEKBlvC5mQT/G7OAteOENo7ygSeRJgVdz7AHikcHUxegtavXkJtFCJ/PSjpjytFKfGRmG8peUVAmNQ==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@sap/hdi": "^4.8.0", + "@sap/hdi": "^4.8.1", "@sap/xsenv": "^6.0.0", "async": "^3.2.6", "dotenv": "^16.4.5", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "micromatch": "^4.0.8" }, "engines": { @@ -2261,9 +2261,9 @@ "license": "MIT" }, "node_modules/better-sqlite3": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz", - "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==", + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", + "integrity": "sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2588,9 +2588,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2681,21 +2681,34 @@ } }, "node_modules/express/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^1.0.5", + "content-type": "^2.0.0", "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -3120,9 +3133,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3132,9 +3145,9 @@ } }, "node_modules/hdb": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/hdb/-/hdb-2.27.1.tgz", - "integrity": "sha512-xYL/W+fq2TyGHyzm8muolQnw8tdh4+2NQ8mQP2FpLSuhfJ8l0jQNSUZoAXic7NfMEan1Jvf8V1L4blwkgTc6+A==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/hdb/-/hdb-2.29.4.tgz", + "integrity": "sha512-9L7/xjx4NU2YWatqLSHXhuEIuvNlV/4eRFg7u/L63U1Dc5LocP4yWeH8UGKTLBCJkt548OQ+A7PqqimZwEuqdw==", "license": "Apache-2.0", "dependencies": { "iconv-lite": "0.7.0" @@ -3545,12 +3558,13 @@ } }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -3690,9 +3704,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -3754,14 +3768,14 @@ "license": "ISC" }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, diff --git a/package.json b/package.json index 966fb95c..405becb6 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "1.0.0", "description": "Generated by cds-services-archetype", "devDependencies": { + "@sap/cds-compiler": "^6.9.3", "@sap/cds-dk": "9.9.2", - "@sap/cds-mtxs": "^3", - "@sap/cds-compiler": "^6.9.3" + "@sap/cds-mtxs": "^3.9.4" }, "workspaces": [ "mtx/sidecar" diff --git a/pom.xml b/pom.xml index 58671c61..32851791 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.15 + 4.1.0 @@ -28,9 +28,9 @@ 25 - 4.9.0 + 5.0.0 5.31.0 - 3.7.3 + 4.0.7 4.2.0 1.5.0 @@ -156,7 +156,7 @@ - 3.6.3 + 3.9.14 ${jdk.version} 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 {