diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/AbstractJsonMarshalTester.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/AbstractJsonMarshalTester.java index f19b616450..1e09fdc7b0 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/AbstractJsonMarshalTester.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/AbstractJsonMarshalTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,6 @@ import java.io.Reader; import java.io.StringReader; import java.lang.reflect.Field; -import com.jayway.jsonpath.Configuration; import org.assertj.core.api.Assertions; import org.springframework.beans.factory.ObjectFactory; @@ -73,8 +72,6 @@ public abstract class AbstractJsonMarshalTester { private ResolvableType type; - private Configuration configuration; - /** * Create a new uninitialized {@link AbstractJsonMarshalTester} instance. */ @@ -88,22 +85,9 @@ public abstract class AbstractJsonMarshalTester { * @param type the type under test */ public AbstractJsonMarshalTester(Class resourceLoadClass, ResolvableType type) { - this(resourceLoadClass, type, Configuration.defaultConfiguration()); - } - - /** - * Create a new {@link AbstractJsonMarshalTester} instance. - * @param resourceLoadClass the source class used when loading relative classpath - * resources - * @param type the type under test - * @param configuration the json-path configuration - */ - public AbstractJsonMarshalTester(Class resourceLoadClass, ResolvableType type, - Configuration configuration) { Assert.notNull(resourceLoadClass, "ResourceLoadClass must not be null"); Assert.notNull(type, "Type must not be null"); - Assert.notNull(configuration, "Configuration must not be null"); - initialize(resourceLoadClass, type, configuration); + initialize(resourceLoadClass, type); } /** @@ -113,23 +97,9 @@ public abstract class AbstractJsonMarshalTester { * @param type the type under test */ protected final void initialize(Class resourceLoadClass, ResolvableType type) { - initialize(resourceLoadClass, type, Configuration.defaultConfiguration()); - } - - /** - * Initialize the marshal tester for use. - * @param resourceLoadClass the source class used when loading relative classpath - * resources - * @param type the type under test - * @param configuration the json-path configuration - */ - protected final void initialize(Class resourceLoadClass, ResolvableType type, - Configuration configuration) { - if (this.resourceLoadClass == null && this.type == null - && this.configuration == null) { + if (this.resourceLoadClass == null && this.type == null) { this.resourceLoadClass = resourceLoadClass; this.type = type; - this.configuration = configuration; } } @@ -159,8 +129,18 @@ public abstract class AbstractJsonMarshalTester { verify(); Assert.notNull(value, "Value must not be null"); String json = writeObject(value, this.type); - return new JsonContent<>(this.resourceLoadClass, this.type, json, - this.configuration); + return getJsonContent(json); + } + + /** + * Factory method used to get a {@link JsonContent} instance from a source JSON + * string. + * @param json the source JSON + * @return a new {@link JsonContent} instance + * @since 2.1.5 + */ + protected JsonContent getJsonContent(String json) { + return new JsonContent<>(getResourceLoadClass(), getType(), json); } /** diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/BasicJsonTester.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/BasicJsonTester.java index eaacf08f01..ae593fbb83 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/BasicJsonTester.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/BasicJsonTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,6 @@ import java.io.File; import java.io.InputStream; import java.nio.charset.Charset; -import com.jayway.jsonpath.Configuration; - import org.springframework.core.io.Resource; import org.springframework.util.Assert; @@ -51,8 +49,6 @@ public class BasicJsonTester { private JsonLoader loader; - private Configuration configuration; - /** * Create a new uninitialized {@link BasicJsonTester} instance. */ @@ -74,21 +70,8 @@ public class BasicJsonTester { * @since 1.4.1 */ public BasicJsonTester(Class resourceLoadClass, Charset charset) { - this(resourceLoadClass, charset, Configuration.defaultConfiguration()); - } - - /** - * Create a new {@link BasicJsonTester} instance. - * @param resourceLoadClass the source class used to load resources - * @param charset the charset used to load resources - * @param configuration the json-path configuration - */ - public BasicJsonTester(Class resourceLoadClass, Charset charset, - Configuration configuration) { Assert.notNull(resourceLoadClass, "ResourceLoadClass must not be null"); - Assert.notNull(configuration, "Configuration must not be null"); this.loader = new JsonLoader(resourceLoadClass, charset); - this.configuration = configuration; } /** @@ -109,22 +92,8 @@ public class BasicJsonTester { * @since 1.4.1 */ protected final void initialize(Class resourceLoadClass, Charset charset) { - initialize(resourceLoadClass, charset, Configuration.defaultConfiguration()); - } - - /** - * Initialize the marshal tester for use. - * @param resourceLoadClass the source class used when loading relative classpath - * resources - * @param charset the charset used when loading relative classpath resources - * @param configuration the json-path configuration - * @since - */ - protected final void initialize(Class resourceLoadClass, Charset charset, - Configuration configuration) { - if (this.loader == null && this.configuration == null) { + if (this.loader == null) { this.loader = new JsonLoader(resourceLoadClass, charset); - this.configuration = configuration; } } @@ -196,8 +165,7 @@ public class BasicJsonTester { } private JsonContent getJsonContent(String json) { - return new JsonContent<>(this.loader.getResourceLoadClass(), null, json, - this.configuration); + return new JsonContent<>(this.loader.getResourceLoadClass(), null, json); } } diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/GsonTester.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/GsonTester.java index 89f77d9a94..bcef31b0fb 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/GsonTester.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/GsonTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import java.io.IOException; import java.io.Reader; import com.google.gson.Gson; -import com.jayway.jsonpath.Configuration; import org.springframework.beans.factory.ObjectFactory; import org.springframework.core.ResolvableType; @@ -75,20 +74,7 @@ public class GsonTester extends AbstractJsonMarshalTester { * @see #initFields(Object, Gson) */ public GsonTester(Class resourceLoadClass, ResolvableType type, Gson gson) { - this(resourceLoadClass, type, gson, Configuration.defaultConfiguration()); - } - - /** - * Create a new {@link GsonTester} instance. - * @param resourceLoadClass the source class used to load resources - * @param type the type under test - * @param gson the Gson instance - * @param configuration the json-path configuration - * @see #initFields(Object, Gson) - */ - public GsonTester(Class resourceLoadClass, ResolvableType type, Gson gson, - Configuration configuration) { - super(resourceLoadClass, type, configuration); + super(resourceLoadClass, type); Assert.notNull(gson, "Gson must not be null"); this.gson = gson; } diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java index a5d66a14a5..a971bc8a97 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,7 @@ import org.springframework.util.Assert; * @param the type under test * @author Phillip Webb * @author Madhura Bhave + * @author Diego Berrueta * @since 1.4.0 */ public class JacksonTester extends AbstractJsonMarshalTester { @@ -89,14 +90,20 @@ public class JacksonTester extends AbstractJsonMarshalTester { public JacksonTester(Class resourceLoadClass, ResolvableType type, ObjectMapper objectMapper, Class view) { - super(resourceLoadClass, type, Configuration.builder() - .jsonProvider(new JacksonJsonProvider(objectMapper)) - .mappingProvider(new JacksonMappingProvider(objectMapper)).build()); + super(resourceLoadClass, type); Assert.notNull(objectMapper, "ObjectMapper must not be null"); this.objectMapper = objectMapper; this.view = view; } + @Override + protected JsonContent getJsonContent(String json) { + Configuration configuration = Configuration.builder() + .jsonProvider(new JacksonJsonProvider(this.objectMapper)) + .mappingProvider(new JacksonMappingProvider(this.objectMapper)).build(); + return new JsonContent<>(getResourceLoadClass(), getType(), json, configuration); + } + @Override protected T readObject(InputStream inputStream, ResolvableType type) throws IOException { diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContent.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContent.java index 8c4d61f730..e2b1baab77 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContent.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContent.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import org.springframework.util.Assert; * * @param the source type that created the content * @author Phillip Webb + * @author Diego Berrueta * @since 1.4.0 */ public final class JsonContent implements AssertProvider { @@ -56,9 +57,9 @@ public final class JsonContent implements AssertProvider { * @param resourceLoadClass the source class used to load resources * @param type the type under test (or {@code null} if not known) * @param json the actual JSON content - * @param configuration the json-path configuration + * @param configuration the JsonPath configuration */ - public JsonContent(Class resourceLoadClass, ResolvableType type, String json, + JsonContent(Class resourceLoadClass, ResolvableType type, String json, Configuration configuration) { Assert.notNull(resourceLoadClass, "ResourceLoadClass must not be null"); Assert.notNull(json, "JSON must not be null"); diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContentAssert.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContentAssert.java index ef99439531..9eb44e896c 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContentAssert.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonContentAssert.java @@ -46,6 +46,7 @@ import org.springframework.util.StringUtils; * * @author Phillip Webb * @author Andy Wilkinson + * @author Diego Berrueta * @since 1.4.0 */ public class JsonContentAssert extends AbstractAssert { @@ -84,8 +85,8 @@ public class JsonContentAssert extends AbstractAssert resourceLoadClass, Charset charset, - CharSequence json, Configuration configuration) { + JsonContentAssert(Class resourceLoadClass, Charset charset, CharSequence json, + Configuration configuration) { super(json, JsonContentAssert.class); this.configuration = configuration; this.loader = new JsonLoader(resourceLoadClass, charset); diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonbTester.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonbTester.java index 63acafab74..c29b887967 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonbTester.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/json/JsonbTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,6 @@ import java.io.Reader; import javax.json.bind.Jsonb; -import com.jayway.jsonpath.Configuration; - import org.springframework.beans.factory.ObjectFactory; import org.springframework.core.ResolvableType; import org.springframework.util.Assert; @@ -76,20 +74,7 @@ public class JsonbTester extends AbstractJsonMarshalTester { * @see #initFields(Object, Jsonb) */ public JsonbTester(Class resourceLoadClass, ResolvableType type, Jsonb jsonb) { - this(resourceLoadClass, type, jsonb, Configuration.defaultConfiguration()); - } - - /** - * Create a new {@link JsonbTester} instance. - * @param resourceLoadClass the source class used to load resources - * @param type the type under test - * @param jsonb the Jsonb instance - * @param configuration the json-path configuration - * @see #initFields(Object, Jsonb) - */ - public JsonbTester(Class resourceLoadClass, ResolvableType type, Jsonb jsonb, - Configuration configuration) { - super(resourceLoadClass, type, configuration); + super(resourceLoadClass, type); Assert.notNull(jsonb, "Jsonb must not be null"); this.jsonb = jsonb; } diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/json/JacksonTesterIntegrationTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/json/JacksonTesterIntegrationTests.java index 94ef07a80c..ab603230bf 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/json/JacksonTesterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/json/JacksonTesterIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Phillip Webb * @author Madhura Bhave + * @author Diego Berrueta */ public class JacksonTesterIntegrationTests { @@ -91,14 +92,14 @@ public class JacksonTesterIntegrationTests { .isEqualTo(stringWithSpecialCharacters); } - // This test confirms that the handling of special characters is symmetrical between - // the serialisation (via the JacksonTester) and the parsing (via json-path). By - // default json-path uses SimpleJson as its parser, which has a slightly different - // behaviour to Jackson and breaks the symmetry. However JacksonTester - // configures json-path to use Jackson for evaluating the path expressions and - // restores the symmetry. @Test public void parseSpecialCharactersTest() throws Exception { + // Confirms that the handling of special characters is symmetrical between + // the serialization (via the JacksonTester) and the parsing (via json-path). By + // default json-path uses SimpleJson as its parser, which has a slightly different + // behavior to Jackson and breaks the symmetry. JacksonTester + // configures json-path to use Jackson for evaluating the path expressions and + // restores the symmetry. See gh-15727 String stringWithSpecialCharacters = "\u0006\u007F"; assertThat(this.stringJson.write(stringWithSpecialCharacters)) .extractingJsonPathStringValue("@")