Skip to content

Commit 3b3d8f6

Browse files
committed
Update to Spring-Boot 4.4.0-SNAPSHOT / Kotlin 2.2.0-RC
1 parent 2fe5ac0 commit 3b3d8f6

18 files changed

+109
-75
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,20 @@ Running S3Mock in unit tests is still supported by using [TestContainers](https:
139139
* S3Mock will use the baseline Spring chooses to support.
140140
* The Docker container will run Java 25 LTS.
141141

142+
## 5.0.0 - PLANNED
143+
144+
* Features and fixes
145+
* TBD
146+
* Refactorings
147+
* AWS has deprecated SDK for Java v1, and will remove support EOY 2025.
148+
* Remove Java v1.
149+
* JUnit 4.x deprecation
150+
* Remove JUnit 4.x support.
151+
* Version updates
152+
* Bump Spring Boot version to 4.x
153+
* Bump Spring Framework version to 7.x
154+
* Bump java version from 17 to 25
155+
142156
# CURRENT - 4.x - THIS VERSION IS UNDER ACTIVE DEVELOPMENT
143157
Version 4.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Java integration.
144158

pom.xml

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,40 @@
6565
<url>https://github.com/adobe/S3Mock/tree/main</url>
6666
</scm>
6767

68+
<repositories>
69+
<!-- TODO: remove after upgrading to Spring Boot 4 release in November -->
70+
<repository>
71+
<id>spring-milestones</id>
72+
<name>Spring Milestone Repository</name>
73+
<url>https://repo.spring.io/milestone</url>
74+
</repository>
75+
<repository>
76+
<id>spring-snapshots</id>
77+
<name>Spring Snapshot Repository</name>
78+
<url>https://repo.spring.io/snapshot</url>
79+
<snapshots>
80+
<enabled>true</enabled>
81+
</snapshots>
82+
</repository>
83+
</repositories>
84+
85+
<pluginRepositories>
86+
<!-- TODO: remove after upgrading to Spring Boot 4 release in November -->
87+
<pluginRepository>
88+
<id>spring-milestones</id>
89+
<name>Spring Milestone Repository</name>
90+
<url>https://repo.spring.io/milestone</url>
91+
</pluginRepository>
92+
<pluginRepository>
93+
<id>spring-snapshots</id>
94+
<name>Spring Snapshot Repository</name>
95+
<url>https://repo.spring.io/snapshot</url>
96+
<snapshots>
97+
<enabled>true</enabled>
98+
</snapshots>
99+
</pluginRepository>
100+
</pluginRepositories>
101+
68102
<distributionManagement>
69103
<repository>
70104
<id>ossrh</id>
@@ -77,11 +111,13 @@
77111
</distributionManagement>
78112

79113
<properties>
80-
<java.version>17</java.version>
81-
<kotlin.version>2.1.21</kotlin.version>
114+
<!-- TODO: Upgrade to Java 25 release in November -->
115+
<java.version>21</java.version>
116+
<!-- TODO: Upgrade to Kotlin 2.2.0 after release -->
117+
<kotlin.version>2.2.0-RC</kotlin.version>
82118
<kotlin.compiler.jvmTarget>${java.version}</kotlin.compiler.jvmTarget>
83-
<kotlin.compiler.apiVersion>2.1</kotlin.compiler.apiVersion>
84-
<kotlin.compiler.languageVersion>2.1</kotlin.compiler.languageVersion>
119+
<kotlin.compiler.apiVersion>2.2</kotlin.compiler.apiVersion>
120+
<kotlin.compiler.languageVersion>2.2</kotlin.compiler.languageVersion>
85121

86122
<aws-v2.version>2.31.50</aws-v2.version>
87123

@@ -127,7 +163,8 @@
127163
<!-- Run Docker build by default -->
128164
<skipDocker>false</skipDocker>
129165
<sortpom-maven-plugin.version>4.0.0</sortpom-maven-plugin.version>
130-
<spring-boot.version>3.5.0</spring-boot.version>
166+
<!-- TODO: update to 4.0.0 after Spring Boot 4 release in November -->
167+
<spring-boot.version>4.0.0-SNAPSHOT</spring-boot.version>
131168
<testcontainers.version>1.21.1</testcontainers.version>
132169
<testng.version>7.11.0</testng.version>
133170
<xmlunit-assertj3.version>2.10.2</xmlunit-assertj3.version>

server/src/main/java/com/adobe/testing/s3mock/S3MockConfiguration.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
2121

2222
import com.adobe.testing.s3mock.dto.ErrorResponse;
23-
import com.adobe.testing.s3mock.dto.Region;
2423
import com.adobe.testing.s3mock.service.BucketService;
2524
import com.adobe.testing.s3mock.service.MultipartService;
2625
import com.adobe.testing.s3mock.service.ObjectService;

server/src/main/java/com/adobe/testing/s3mock/util/HeaderUtil.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,14 @@ public static Map<String, String> encryptionHeadersFrom(HttpHeaders headers) {
136136
private static Map<String, String> parseHeadersToMap(HttpHeaders headers,
137137
Predicate<String> matcher) {
138138
return headers
139-
.entrySet()
139+
.headerSet()
140140
.stream()
141141
.map(
142142
entry -> {
143143
if (matcher.test(entry.getKey())
144-
&& entry.getValue() != null
145144
&& !entry.getValue().isEmpty()
146-
&& isNotBlank(entry.getValue().get(0))) {
147-
return new SimpleEntry<>(entry.getKey(), entry.getValue().get(0));
145+
&& isNotBlank(entry.getValue().getFirst())) {
146+
return new SimpleEntry<>(entry.getKey(), entry.getValue().getFirst());
148147
} else {
149148
return null;
150149
}
@@ -227,17 +226,17 @@ public static Map<String, String> checksumHeaderFrom(
227226

228227
@Nullable
229228
public static ChecksumAlgorithm checksumAlgorithmFromHeader(HttpHeaders headers) {
230-
if (headers.containsKey(X_AMZ_CHECKSUM_SHA256)) {
229+
if (headers.containsHeader(X_AMZ_CHECKSUM_SHA256)) {
231230
return ChecksumAlgorithm.SHA256;
232-
} else if (headers.containsKey(X_AMZ_CHECKSUM_SHA1)) {
231+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_SHA1)) {
233232
return ChecksumAlgorithm.SHA1;
234-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC32)) {
233+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC32)) {
235234
return ChecksumAlgorithm.CRC32;
236-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC32C)) {
235+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC32C)) {
237236
return ChecksumAlgorithm.CRC32C;
238-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC64NVME)) {
237+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC64NVME)) {
239238
return ChecksumAlgorithm.CRC64NVME;
240-
} else if (headers.containsKey(X_AMZ_CHECKSUM_ALGORITHM)) {
239+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_ALGORITHM)) {
241240
var checksumAlgorithm = headers.getFirst(X_AMZ_CHECKSUM_ALGORITHM);
242241
return ChecksumAlgorithm.fromString(checksumAlgorithm);
243242
} else {
@@ -247,7 +246,7 @@ public static ChecksumAlgorithm checksumAlgorithmFromHeader(HttpHeaders headers)
247246

248247
@Nullable
249248
public static ChecksumAlgorithm checksumAlgorithmFromSdk(HttpHeaders headers) {
250-
if (headers.containsKey(X_AMZ_SDK_CHECKSUM_ALGORITHM)) {
249+
if (headers.containsHeader(X_AMZ_SDK_CHECKSUM_ALGORITHM)) {
251250
return ChecksumAlgorithm.fromString(headers.getFirst(X_AMZ_SDK_CHECKSUM_ALGORITHM));
252251
} else {
253252
return null;
@@ -256,15 +255,15 @@ public static ChecksumAlgorithm checksumAlgorithmFromSdk(HttpHeaders headers) {
256255

257256
@Nullable
258257
public static String checksumFrom(HttpHeaders headers) {
259-
if (headers.containsKey(X_AMZ_CHECKSUM_SHA256)) {
258+
if (headers.containsHeader(X_AMZ_CHECKSUM_SHA256)) {
260259
return headers.getFirst(X_AMZ_CHECKSUM_SHA256);
261-
} else if (headers.containsKey(X_AMZ_CHECKSUM_SHA1)) {
260+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_SHA1)) {
262261
return headers.getFirst(X_AMZ_CHECKSUM_SHA1);
263-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC32)) {
262+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC32)) {
264263
return headers.getFirst(X_AMZ_CHECKSUM_CRC32);
265-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC32C)) {
264+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC32C)) {
266265
return headers.getFirst(X_AMZ_CHECKSUM_CRC32C);
267-
} else if (headers.containsKey(X_AMZ_CHECKSUM_CRC64NVME)) {
266+
} else if (headers.containsHeader(X_AMZ_CHECKSUM_CRC64NVME)) {
268267
return headers.getFirst(X_AMZ_CHECKSUM_CRC64NVME);
269268
}
270269
return null;

server/src/test/kotlin/com/adobe/testing/s3mock/BucketControllerTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,25 +63,23 @@ import org.mockito.kotlin.verify
6363
import org.mockito.kotlin.whenever
6464
import org.springframework.beans.factory.annotation.Autowired
6565
import org.springframework.boot.test.context.SpringBootTest
66-
import org.springframework.boot.test.mock.mockito.MockBean
6766
import org.springframework.boot.test.web.client.TestRestTemplate
6867
import org.springframework.http.HttpEntity
6968
import org.springframework.http.HttpHeaders
7069
import org.springframework.http.HttpMethod
7170
import org.springframework.http.HttpStatus
7271
import org.springframework.http.MediaType
72+
import org.springframework.test.context.bean.override.mockito.MockitoBean
7373
import org.springframework.web.util.UriComponentsBuilder
7474
import java.net.URI
7575
import java.nio.file.Paths
7676
import java.time.Instant
7777

78-
@MockBean(
79-
classes = [KmsKeyStore::class, ObjectService::class, MultipartService::class, ObjectController::class, MultipartController::class]
80-
)
78+
@MockitoBean(types = [KmsKeyStore::class, ObjectService::class, MultipartService::class, ObjectController::class, MultipartController::class])
8179
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
8280
properties = ["com.adobe.testing.s3mock.region=us-east-1"])
8381
internal class BucketControllerTest : BaseControllerTest() {
84-
@MockBean
82+
@MockitoBean
8583
private lateinit var bucketService: BucketService
8684

8785
@Autowired

server/src/test/kotlin/com/adobe/testing/s3mock/ContextPathObjectStoreControllerTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,23 @@ import org.junit.jupiter.api.Test
2929
import org.mockito.kotlin.whenever
3030
import org.springframework.beans.factory.annotation.Autowired
3131
import org.springframework.boot.test.context.SpringBootTest
32-
import org.springframework.boot.test.mock.mockito.MockBean
3332
import org.springframework.boot.test.web.client.TestRestTemplate
3433
import org.springframework.http.HttpEntity
3534
import org.springframework.http.HttpHeaders
3635
import org.springframework.http.HttpMethod
3736
import org.springframework.http.HttpStatus
3837
import org.springframework.http.MediaType
38+
import org.springframework.test.context.bean.override.mockito.MockitoBean
3939
import java.nio.file.Paths
4040
import java.time.Instant
4141

42-
@MockBean(classes = [KmsKeyStore::class, ObjectService::class, MultipartService::class, MultipartStore::class])
42+
@MockitoBean(types = [KmsKeyStore::class, ObjectService::class, MultipartService::class, MultipartStore::class])
4343
@SpringBootTest(
4444
properties = ["com.adobe.testing.s3mock.contextPath=s3-mock"],
4545
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
4646
)
4747
internal class ContextPathObjectStoreControllerTest : BaseControllerTest() {
48-
@MockBean
48+
@MockitoBean
4949
private lateinit var bucketService: BucketService
5050

5151
@Autowired

server/src/test/kotlin/com/adobe/testing/s3mock/FaviconControllerTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2017-2024 Adobe.
2+
* Copyright 2017-2025 Adobe.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,15 +20,15 @@ import org.assertj.core.api.Assertions.assertThat
2020
import org.junit.jupiter.api.Test
2121
import org.springframework.beans.factory.annotation.Autowired
2222
import org.springframework.boot.test.context.SpringBootTest
23-
import org.springframework.boot.test.mock.mockito.MockBean
2423
import org.springframework.boot.test.web.client.TestRestTemplate
2524
import org.springframework.http.HttpEntity
2625
import org.springframework.http.HttpHeaders
2726
import org.springframework.http.HttpMethod
2827
import org.springframework.http.HttpStatus
2928
import org.springframework.http.MediaType
29+
import org.springframework.test.context.bean.override.mockito.MockitoBean
3030

31-
@MockBean(classes = [KmsKeyStore::class, ObjectController::class, BucketController::class, MultipartController::class])
31+
@MockitoBean(types = [KmsKeyStore::class, ObjectController::class, BucketController::class, MultipartController::class])
3232
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
3333
internal class FaviconControllerTest : BaseControllerTest() {
3434
@Autowired

server/src/test/kotlin/com/adobe/testing/s3mock/MultipartControllerTest.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,30 +33,25 @@ import org.mockito.kotlin.doThrow
3333
import org.mockito.kotlin.whenever
3434
import org.springframework.beans.factory.annotation.Autowired
3535
import org.springframework.boot.test.context.SpringBootTest
36-
import org.springframework.boot.test.mock.mockito.MockBean
37-
import org.springframework.boot.test.mock.mockito.MockBeans
3836
import org.springframework.boot.test.web.client.TestRestTemplate
3937
import org.springframework.http.HttpEntity
4038
import org.springframework.http.HttpHeaders
4139
import org.springframework.http.HttpMethod
4240
import org.springframework.http.HttpStatus
4341
import org.springframework.http.MediaType
42+
import org.springframework.test.context.bean.override.mockito.MockitoBean
4443
import org.springframework.web.util.UriComponentsBuilder
4544
import java.nio.file.Paths
4645
import java.time.Instant
4746
import java.util.Date
4847

49-
@MockBeans(
50-
MockBean(
51-
classes = [KmsKeyStore::class, ObjectService::class, ObjectController::class, BucketController::class]
52-
)
53-
)
48+
@MockitoBean(types = [KmsKeyStore::class, ObjectService::class, ObjectController::class, BucketController::class])
5449
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
5550
internal class MultipartControllerTest : BaseControllerTest() {
56-
@MockBean
51+
@MockitoBean
5752
private lateinit var bucketService: BucketService
5853

59-
@MockBean
54+
@MockitoBean
6055
private lateinit var multipartService: MultipartService
6156

6257
@Autowired

server/src/test/kotlin/com/adobe/testing/s3mock/ObjectControllerTest.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import org.springframework.http.HttpHeaders
5858
import org.springframework.http.HttpMethod
5959
import org.springframework.http.HttpStatus
6060
import org.springframework.http.MediaType
61+
import org.springframework.test.context.bean.override.mockito.MockitoBean
6162
import org.springframework.web.util.UriComponentsBuilder
6263
import software.amazon.awssdk.checksums.DefaultChecksumAlgorithm
6364
import java.io.File
@@ -68,17 +69,13 @@ import java.nio.file.Paths
6869
import java.time.Instant
6970
import java.util.UUID
7071

71-
@MockBeans(
72-
MockBean(
73-
classes = [KmsKeyStore::class, MultipartService::class, BucketController::class, MultipartController::class]
74-
)
75-
)
72+
@MockitoBean(types = [KmsKeyStore::class, MultipartService::class, BucketController::class, MultipartController::class])
7673
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
7774
internal class ObjectControllerTest : BaseControllerTest() {
78-
@MockBean
75+
@MockitoBean
7976
private lateinit var objectService: ObjectService
8077

81-
@MockBean
78+
@MockitoBean
8279
private lateinit var bucketService: BucketService
8380

8481
@Autowired

server/src/test/kotlin/com/adobe/testing/s3mock/service/BucketServiceTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,24 @@ package com.adobe.testing.s3mock.service
1818

1919
import com.adobe.testing.s3mock.S3Exception
2020
import com.adobe.testing.s3mock.dto.ObjectOwnership
21-
import com.adobe.testing.s3mock.dto.S3Object
2221
import com.adobe.testing.s3mock.dto.VersioningConfiguration
2322
import com.adobe.testing.s3mock.dto.VersioningConfiguration.Status
2423
import com.adobe.testing.s3mock.store.BucketMetadata
2524
import com.adobe.testing.s3mock.store.MultipartStore
2625
import org.assertj.core.api.Assertions.assertThat
2726
import org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy
2827
import org.junit.jupiter.api.Test
29-
import org.junit.jupiter.params.ParameterizedTest
30-
import org.junit.jupiter.params.provider.MethodSource
3128
import org.mockito.Mockito.verify
3229
import org.mockito.kotlin.whenever
3330
import org.springframework.beans.factory.annotation.Autowired
3431
import org.springframework.boot.test.context.SpringBootTest
35-
import org.springframework.boot.test.mock.mockito.MockBean
32+
import org.springframework.test.context.bean.override.mockito.MockitoBean
3633
import java.nio.file.Files
3734
import java.util.Date
3835
import java.util.UUID
39-
import java.util.stream.Collectors
4036

4137
@SpringBootTest(classes = [ServiceConfiguration::class], webEnvironment = SpringBootTest.WebEnvironment.NONE)
42-
@MockBean(classes = [ObjectService::class, MultipartService::class, MultipartStore::class])
38+
@MockitoBean(types = [ObjectService::class, MultipartService::class, MultipartStore::class])
4339
internal class BucketServiceTest : ServiceTestBase() {
4440
@Autowired
4541
private lateinit var iut: BucketService

0 commit comments

Comments
 (0)