mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-20 20:59:07 +00:00
Add JsonConverterDelegate
The JsonConverterDelegate interface replaces usages of HttpMessageContentConverter to provides the flexibility to use either message converters or WebFlux codecs. HttpMessageContentConverter is deprecated, and replaced with a package private copy (DefaultJsonConverterDelegate) in the org.springframework.test.json package that is accessible through a static method on JsonConverterDelegate. See gh-35737
This commit is contained in:
+9
-10
@@ -53,7 +53,6 @@ import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
|
||||
import org.springframework.test.http.HttpMessageContentConverter;
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -85,8 +84,8 @@ class AbstractJsonContentAssertTests {
|
||||
|
||||
private static final String DIFFERENT = loadJson("different.json");
|
||||
|
||||
private static final HttpMessageContentConverter jsonContentConverter = HttpMessageContentConverter.of(
|
||||
new JacksonJsonHttpMessageConverter(new JsonMapper()));
|
||||
private static final JsonConverterDelegate jsonContentConverter =
|
||||
JsonConverterDelegate.of(List.of(new JacksonJsonHttpMessageConverter(new JsonMapper())));
|
||||
|
||||
private static final JsonComparator comparator = JsonAssert.comparator(JsonCompareMode.LENIENT);
|
||||
|
||||
@@ -120,10 +119,10 @@ class AbstractJsonContentAssertTests {
|
||||
.hasFamilyMember("Homer");
|
||||
}
|
||||
|
||||
private AssertProvider<AbstractJsonContentAssert<?>> forJson(@Nullable String json,
|
||||
@Nullable HttpMessageContentConverter jsonContentConverter) {
|
||||
private AssertProvider<AbstractJsonContentAssert<?>> forJson(
|
||||
@Nullable String json, @Nullable JsonConverterDelegate converter) {
|
||||
|
||||
return () -> new TestJsonContentAssert(json, jsonContentConverter);
|
||||
return () -> new TestJsonContentAssert(json, converter);
|
||||
}
|
||||
|
||||
private static class FamilyAssertFactory extends InstanceOfAssertFactory<Family, FamilyAssert> {
|
||||
@@ -386,8 +385,8 @@ class AbstractJsonContentAssertTests {
|
||||
return () -> new TestJsonContentAssert(json, null);
|
||||
}
|
||||
|
||||
private AssertProvider<AbstractJsonContentAssert<?>> forJson(@Nullable String json, HttpMessageContentConverter jsonContentConverter) {
|
||||
return () -> new TestJsonContentAssert(json, jsonContentConverter);
|
||||
private AssertProvider<AbstractJsonContentAssert<?>> forJson(@Nullable String json, JsonConverterDelegate converter) {
|
||||
return () -> new TestJsonContentAssert(json, converter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -886,8 +885,8 @@ class AbstractJsonContentAssertTests {
|
||||
|
||||
private static class TestJsonContentAssert extends AbstractJsonContentAssert<TestJsonContentAssert> {
|
||||
|
||||
public TestJsonContentAssert(@Nullable String json, @Nullable HttpMessageContentConverter jsonContentConverter) {
|
||||
super((json != null ? new JsonContent(json, jsonContentConverter) : null), TestJsonContentAssert.class);
|
||||
public TestJsonContentAssert(@Nullable String json, @Nullable JsonConverterDelegate converter) {
|
||||
super((json != null ? new JsonContent(json, converter) : null), TestJsonContentAssert.class);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+34
-34
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.test.http;
|
||||
package org.springframework.test.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
@@ -46,11 +46,11 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoInteractions;
|
||||
|
||||
/**
|
||||
* Tests for {@link HttpMessageContentConverter}.
|
||||
* Tests for {@link DefaultJsonConverterDelegate}.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
class HttpMessageContentConverterTests {
|
||||
class DefaultJsonConverterDelegateTests {
|
||||
|
||||
private static final MediaType JSON = MediaType.APPLICATION_JSON;
|
||||
|
||||
@@ -58,17 +58,18 @@ class HttpMessageContentConverterTests {
|
||||
|
||||
private static final JacksonJsonHttpMessageConverter jacksonMessageConverter = new JacksonJsonHttpMessageConverter();
|
||||
|
||||
|
||||
@Test
|
||||
void createInstanceWithEmptyIterable() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> HttpMessageContentConverter.of(List.of()))
|
||||
.isThrownBy(() -> new DefaultJsonConverterDelegate(List.of()))
|
||||
.withMessage("At least one message converter needs to be specified");
|
||||
}
|
||||
|
||||
@Test
|
||||
void createInstanceWithEmptyVarArg() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(HttpMessageContentConverter::of)
|
||||
.isThrownBy(() -> new DefaultJsonConverterDelegate(List.of()))
|
||||
.withMessage("At least one message converter needs to be specified");
|
||||
}
|
||||
|
||||
@@ -79,9 +80,9 @@ class HttpMessageContentConverterTests {
|
||||
listOfIntegers, JSON, message, List.of(1, 2, 3));
|
||||
SmartHttpMessageConverter<?> secondConverter = mockSmartConverterForRead(
|
||||
listOfIntegers, JSON, message, List.of(3, 2, 1));
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(firstConverter, secondConverter));
|
||||
List<Integer> data = contentConverter.convert(message, JSON, listOfIntegers);
|
||||
DefaultJsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(firstConverter, secondConverter));
|
||||
List<Integer> data = converter.read(message, JSON, listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(firstConverter).canRead(listOfIntegers, JSON);
|
||||
verifyNoInteractions(secondConverter);
|
||||
@@ -90,9 +91,9 @@ class HttpMessageContentConverterTests {
|
||||
@Test
|
||||
void convertInvokesGenericHttpMessageConverter() throws IOException {
|
||||
GenericHttpMessageConverter<?> firstConverter = mock(GenericHttpMessageConverter.class);
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(firstConverter, jacksonMessageConverter));
|
||||
List<Integer> data = contentConverter.convert(createMessage("[2,3,4]"), JSON, listOfIntegers);
|
||||
DefaultJsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(firstConverter, jacksonMessageConverter));
|
||||
List<Integer> data = converter.read(createMessage("[2,3,4]"), JSON, listOfIntegers);
|
||||
assertThat(data).containsExactly(2, 3, 4);
|
||||
verify(firstConverter).canRead(listOfIntegers.getType(), List.class, JSON);
|
||||
}
|
||||
@@ -103,9 +104,9 @@ class HttpMessageContentConverterTests {
|
||||
GenericHttpMessageConverter<?> firstConverter = mock(GenericHttpMessageConverter.class);
|
||||
SmartHttpMessageConverter<?> smartConverter = mockSmartConverterForRead(
|
||||
listOfIntegers, JSON, message, List.of(1, 2, 3));
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(firstConverter, smartConverter));
|
||||
List<Integer> data = contentConverter.convert(message, JSON, listOfIntegers);
|
||||
DefaultJsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(firstConverter, smartConverter));
|
||||
List<Integer> data = converter.read(message, JSON, listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(smartConverter).canRead(listOfIntegers, JSON);
|
||||
}
|
||||
@@ -117,9 +118,9 @@ class HttpMessageContentConverterTests {
|
||||
listOfIntegers, JSON, message, List.of(1, 2, 3));
|
||||
HttpMessageConverter<?> thirdConverter = mockSimpleConverterForRead(
|
||||
List.class, MediaType.TEXT_PLAIN, message, List.of(1, 2, 3));
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(jacksonMessageConverter, secondConverter, thirdConverter));
|
||||
List<Integer> data = contentConverter.convert(message, MediaType.TEXT_PLAIN, listOfIntegers);
|
||||
DefaultJsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(jacksonMessageConverter, secondConverter, thirdConverter));
|
||||
List<Integer> data = converter.read(message, MediaType.TEXT_PLAIN, listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(secondConverter).canRead(listOfIntegers, MediaType.TEXT_PLAIN);
|
||||
verify(thirdConverter).canRead(List.class, MediaType.TEXT_PLAIN);
|
||||
@@ -132,10 +133,9 @@ class HttpMessageContentConverterTests {
|
||||
listOfIntegers, MediaType.TEXT_PLAIN, message, List.of(1, 2, 3));
|
||||
SmartHttpMessageConverter<?> htmlConverter = mockSmartConverterForRead(
|
||||
listOfIntegers, MediaType.TEXT_HTML, message, List.of(3, 2, 1));
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(textConverter, htmlConverter));
|
||||
DefaultJsonConverterDelegate converter = new DefaultJsonConverterDelegate(List.of(textConverter, htmlConverter));
|
||||
assertThatIllegalStateException()
|
||||
.isThrownBy(() -> contentConverter.convert(message, JSON, listOfIntegers))
|
||||
.isThrownBy(() -> converter.read(message, JSON, listOfIntegers))
|
||||
.withMessage("No converter found to read [application/json] to [java.util.List<java.lang.Integer>]");
|
||||
verify(textConverter).canRead(listOfIntegers, JSON);
|
||||
verify(htmlConverter).canRead(listOfIntegers, JSON);
|
||||
@@ -148,9 +148,9 @@ class HttpMessageContentConverterTests {
|
||||
SmartHttpMessageConverter<?> readConverter = mockSmartConverterForRead(listOfIntegers, JSON, null, List.of(1, 2, 3));
|
||||
SmartHttpMessageConverter<?> firstWriteJsonConverter = mockSmartConverterForWritingJson(value, valueType, "[1,2,3]");
|
||||
SmartHttpMessageConverter<?> secondWriteJsonConverter = mockSmartConverterForWritingJson(value, valueType, "[3,2,1]");
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(readConverter, firstWriteJsonConverter, secondWriteJsonConverter));
|
||||
List<Integer> data = contentConverter.convertViaJson(value, listOfIntegers);
|
||||
JsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(readConverter, firstWriteJsonConverter, secondWriteJsonConverter));
|
||||
List<Integer> data = converter.map(value, listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(readConverter).canRead(listOfIntegers, JSON);
|
||||
verify(firstWriteJsonConverter).canWrite(valueType, String.class, JSON);
|
||||
@@ -163,9 +163,9 @@ class HttpMessageContentConverterTests {
|
||||
ResolvableType valueType = ResolvableType.forInstance(value);
|
||||
SmartHttpMessageConverter<?> readConverter = mockSmartConverterForRead(listOfIntegers, JSON, null, List.of(1, 2, 3));
|
||||
GenericHttpMessageConverter<?> writeConverter = mockGenericConverterForWritingJson(value, valueType, "[3,2,1]");
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = contentConverter.convertViaJson("[1, 2, 3]", listOfIntegers);
|
||||
JsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = converter.map("[1, 2, 3]", listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(readConverter).canRead(listOfIntegers, JSON);
|
||||
verify(writeConverter).canWrite(valueType.getType(), value.getClass(), JSON);
|
||||
@@ -177,9 +177,9 @@ class HttpMessageContentConverterTests {
|
||||
ResolvableType valueType = ResolvableType.forInstance(value);
|
||||
SmartHttpMessageConverter<?> readConverter = mockSmartConverterForRead(listOfIntegers, JSON, null, List.of(1, 2, 3));
|
||||
SmartHttpMessageConverter<?> writeConverter = mockSmartConverterForWritingJson(value, valueType, "[3,2,1]");
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = contentConverter.convertViaJson("[1, 2, 3]", listOfIntegers);
|
||||
JsonConverterDelegate converter =
|
||||
new DefaultJsonConverterDelegate(List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = converter.map("[1, 2, 3]", listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(readConverter).canRead(listOfIntegers, JSON);
|
||||
verify(writeConverter).canWrite(valueType, value.getClass(), JSON);
|
||||
@@ -190,9 +190,9 @@ class HttpMessageContentConverterTests {
|
||||
String value = "1,2,3";
|
||||
SmartHttpMessageConverter<?> readConverter = mockSmartConverterForRead(listOfIntegers, JSON, null, List.of(1, 2, 3));
|
||||
HttpMessageConverter<?> writeConverter = mockSimpleConverterForWritingJson(value, "[3,2,1]");
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(
|
||||
List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = contentConverter.convertViaJson("[1, 2, 3]", listOfIntegers);
|
||||
JsonConverterDelegate converterDelegate =
|
||||
new DefaultJsonConverterDelegate(List.of(readConverter, writeConverter, jacksonMessageConverter));
|
||||
List<Integer> data = converterDelegate.map("[1, 2, 3]", listOfIntegers);
|
||||
assertThat(data).containsExactly(1, 2, 3);
|
||||
verify(readConverter).canRead(listOfIntegers, JSON);
|
||||
verify(writeConverter).canWrite(value.getClass(), JSON);
|
||||
@@ -203,9 +203,9 @@ class HttpMessageContentConverterTests {
|
||||
String value = "1,2,3";
|
||||
ResolvableType valueType = ResolvableType.forInstance(value);
|
||||
SmartHttpMessageConverter<?> readConverter = mockSmartConverterForRead(listOfIntegers, JSON, null, List.of(1, 2, 3));
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(List.of(readConverter));
|
||||
JsonConverterDelegate converter = new DefaultJsonConverterDelegate(List.of(readConverter));
|
||||
assertThatIllegalStateException()
|
||||
.isThrownBy(() -> contentConverter.convertViaJson(value, listOfIntegers))
|
||||
.isThrownBy(() -> converter.map(value, listOfIntegers))
|
||||
.withMessage("No converter found to convert [java.lang.String] to JSON");
|
||||
verify(readConverter).canWrite(valueType, value.getClass(), JSON);
|
||||
}
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package org.springframework.test.json;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.http.converter.HttpMessageConverter;
|
||||
import org.springframework.test.http.HttpMessageContentConverter;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
@@ -63,9 +64,9 @@ class JsonContentTests {
|
||||
|
||||
@Test
|
||||
void getJsonContentConverterShouldReturnConverter() {
|
||||
HttpMessageContentConverter contentConverter = HttpMessageContentConverter.of(mock(HttpMessageConverter.class));
|
||||
JsonContent content = new JsonContent(JSON, contentConverter);
|
||||
assertThat(content.getContentConverter()).isSameAs(contentConverter);
|
||||
JsonConverterDelegate converter = JsonConverterDelegate.of(List.of(mock(HttpMessageConverter.class)));
|
||||
JsonContent content = new JsonContent(JSON, converter);
|
||||
assertThat(content.getJsonConverterDelegate()).isSameAs(converter);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-3
@@ -30,7 +30,6 @@ import org.junit.jupiter.api.Test;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
|
||||
import org.springframework.test.http.HttpMessageContentConverter;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -205,8 +204,8 @@ class JsonPathValueAssertTests {
|
||||
@Nested
|
||||
class ConvertToTests {
|
||||
|
||||
private static final HttpMessageContentConverter jsonContentConverter = HttpMessageContentConverter.of(
|
||||
new JacksonJsonHttpMessageConverter(new JsonMapper()));
|
||||
private static final JsonConverterDelegate jsonContentConverter =
|
||||
JsonConverterDelegate.of(List.of(new JacksonJsonHttpMessageConverter(new JsonMapper())));
|
||||
|
||||
@Test
|
||||
void convertToWithoutHttpMessageConverter() {
|
||||
|
||||
+2
-1
@@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.test.json.JsonContent;
|
||||
import org.springframework.test.json.JsonConverterDelegate;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
@@ -138,7 +139,7 @@ public class AbstractMockHttpServletResponseAssertTests {
|
||||
private static final class ResponseAssert extends AbstractMockHttpServletResponseAssert<ResponseAssert, MockHttpServletResponse> {
|
||||
|
||||
ResponseAssert(MockHttpServletResponse actual) {
|
||||
super(null, actual, ResponseAssert.class);
|
||||
super((JsonConverterDelegate) null, actual, ResponseAssert.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user