Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
9e2d54fe
Commit
9e2d54fe
authored
Mar 23, 2017
by
Madhura Bhave
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Support json view with JacksonTester
Closes gh-8672
parent
e1f72771
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
261 additions
and
5 deletions
+261
-5
ExampleJsonObjectWithView.java
...ot/test/autoconfigure/json/ExampleJsonObjectWithView.java
+76
-0
JsonTestIntegrationTests.java
...oot/test/autoconfigure/json/JsonTestIntegrationTests.java
+14
-0
AbstractJsonMarshalTester.java
...ngframework/boot/test/json/AbstractJsonMarshalTester.java
+4
-0
JacksonTester.java
...ava/org/springframework/boot/test/json/JacksonTester.java
+40
-3
ExampleObject.java
...ava/org/springframework/boot/test/json/ExampleObject.java
+1
-0
ExampleObjectWithView.java
...springframework/boot/test/json/ExampleObjectWithView.java
+75
-0
JacksonTesterIntegrationTests.java
...amework/boot/test/json/JacksonTesterIntegrationTests.java
+51
-2
No files found.
spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonObjectWithView.java
0 → 100644
View file @
9e2d54fe
/*
* Copyright 2012-2017 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
test
.
autoconfigure
.
json
;
import
com.fasterxml.jackson.annotation.JsonView
;
import
org.springframework.util.ObjectUtils
;
/**
* Example object to read/write as JSON with view
*
* @author Madhura Bhave
*/
public
class
ExampleJsonObjectWithView
{
@JsonView
(
TestView
.
class
)
private
String
value
;
private
int
id
;
public
String
getValue
()
{
return
this
.
value
;
}
public
void
setValue
(
String
value
)
{
this
.
value
=
value
;
}
public
int
getId
()
{
return
this
.
id
;
}
public
void
setId
(
int
id
)
{
this
.
id
=
id
;
}
@Override
public
int
hashCode
()
{
return
0
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
obj
==
null
||
obj
.
getClass
()
!=
getClass
())
{
return
false
;
}
ExampleJsonObjectWithView
other
=
(
ExampleJsonObjectWithView
)
obj
;
return
ObjectUtils
.
nullSafeEquals
(
this
.
value
,
other
.
value
)
&&
ObjectUtils
.
nullSafeEquals
(
this
.
id
,
other
.
id
);
}
@Override
public
String
toString
()
{
return
this
.
value
+
" "
+
this
.
id
;
}
static
class
TestView
{
}
}
spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestIntegrationTests.java
View file @
9e2d54fe
...
...
@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.boot.test.json.BasicJsonTester
;
import
org.springframework.boot.test.json.GsonTester
;
import
org.springframework.boot.test.json.JacksonTester
;
import
org.springframework.boot.test.json.JsonContent
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
...
...
@@ -42,6 +43,9 @@ public class JsonTestIntegrationTests {
@Autowired
private
JacksonTester
<
ExampleBasicObject
>
jacksonBasicJson
;
@Autowired
private
JacksonTester
<
ExampleJsonObjectWithView
>
jacksonWithViewJson
;
@Autowired
private
JacksonTester
<
ExampleCustomObject
>
jacksonCustomJson
;
...
...
@@ -73,4 +77,14 @@ public class JsonTestIntegrationTests {
assertThat
(
this
.
gsonJson
.
write
(
object
)).
isEqualToJson
(
"example.json"
);
}
@Test
public
void
customView
()
throws
Exception
{
ExampleJsonObjectWithView
object
=
new
ExampleJsonObjectWithView
();
object
.
setValue
(
"spring"
);
JsonContent
<
ExampleJsonObjectWithView
>
content
=
this
.
jacksonWithViewJson
.
forView
(
ExampleJsonObjectWithView
.
TestView
.
class
)
.
write
(
object
);
assertThat
(
content
).
doesNotHaveJsonPathValue
(
"id"
);
assertThat
(
content
).
isEqualToJson
(
"example.json"
);
}
}
spring-boot-test/src/main/java/org/springframework/boot/test/json/AbstractJsonMarshalTester.java
View file @
9e2d54fe
...
...
@@ -113,6 +113,10 @@ public abstract class AbstractJsonMarshalTester<T> {
return
this
.
type
;
}
protected
final
Class
<?>
getResourceLoadClass
()
{
return
this
.
resourceLoadClass
;
}
/**
* Return {@link JsonContent} from writing the specific value.
* @param value the value to write
...
...
spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java
View file @
9e2d54fe
...
...
@@ -22,6 +22,8 @@ import java.io.Reader;
import
com.fasterxml.jackson.databind.JavaType
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.ObjectReader
;
import
com.fasterxml.jackson.databind.ObjectWriter
;
import
org.springframework.beans.factory.ObjectFactory
;
import
org.springframework.core.ResolvableType
;
...
...
@@ -53,12 +55,15 @@ import org.springframework.util.Assert;
*
* @param <T> the type under test
* @author Phillip Webb
* @author Madhura Bhave
* @since 1.4.0
*/
public
class
JacksonTester
<
T
>
extends
AbstractJsonMarshalTester
<
T
>
{
private
final
ObjectMapper
objectMapper
;
private
Class
<?>
view
;
/**
* Create a new {@link JacksonTester} instance.
* @param objectMapper the Jackson object mapper
...
...
@@ -76,25 +81,47 @@ public class JacksonTester<T> extends AbstractJsonMarshalTester<T> {
*/
public
JacksonTester
(
Class
<?>
resourceLoadClass
,
ResolvableType
type
,
ObjectMapper
objectMapper
)
{
this
(
resourceLoadClass
,
type
,
objectMapper
,
null
);
}
public
JacksonTester
(
Class
<?>
resourceLoadClass
,
ResolvableType
type
,
ObjectMapper
objectMapper
,
Class
<?>
view
)
{
super
(
resourceLoadClass
,
type
);
Assert
.
notNull
(
objectMapper
,
"ObjectMapper must not be null"
);
this
.
objectMapper
=
objectMapper
;
this
.
view
=
view
;
}
@Override
protected
T
readObject
(
InputStream
inputStream
,
ResolvableType
type
)
throws
IOException
{
return
this
.
objectMapper
.
readValue
(
inputStream
,
getType
(
type
)
);
return
getObjectReader
(
type
).
readValue
(
inputStream
);
}
@Override
protected
T
readObject
(
Reader
reader
,
ResolvableType
type
)
throws
IOException
{
return
this
.
objectMapper
.
readerFor
(
getType
(
type
)).
readValue
(
reader
);
return
getObjectReader
(
type
).
readValue
(
reader
);
}
private
ObjectReader
getObjectReader
(
ResolvableType
type
)
{
ObjectReader
objectReader
=
this
.
objectMapper
.
readerFor
(
getType
(
type
));
if
(
this
.
view
!=
null
)
{
return
objectReader
.
withView
(
this
.
view
);
}
return
objectReader
;
}
@Override
protected
String
writeObject
(
T
value
,
ResolvableType
type
)
throws
IOException
{
return
this
.
objectMapper
.
writerFor
(
getType
(
type
)).
writeValueAsString
(
value
);
return
getObjectWriter
(
type
).
writeValueAsString
(
value
);
}
private
ObjectWriter
getObjectWriter
(
ResolvableType
type
)
{
ObjectWriter
objectWriter
=
this
.
objectMapper
.
writerFor
(
getType
(
type
));
if
(
this
.
view
!=
null
)
{
return
objectWriter
.
withView
(
this
.
view
);
}
return
objectWriter
;
}
private
JavaType
getType
(
ResolvableType
type
)
{
...
...
@@ -124,6 +151,16 @@ public class JacksonTester<T> extends AbstractJsonMarshalTester<T> {
new
JacksonFieldInitializer
().
initFields
(
testInstance
,
objectMapperFactory
);
}
/**
* Returns a new instance of {@link JacksonTester} with the view
* that should be used for json serialization/deserialization.
* @param view the view class
* @return the new instance
*/
public
JacksonTester
<
T
>
forView
(
Class
<?>
view
)
{
return
new
JacksonTester
<
T
>(
this
.
getResourceLoadClass
(),
this
.
getType
(),
this
.
objectMapper
,
view
);
}
/**
* {@link FieldInitializer} for Jackson.
*/
...
...
spring-boot-test/src/test/java/org/springframework/boot/test/json/ExampleObject.java
View file @
9e2d54fe
...
...
@@ -64,3 +64,4 @@ public class ExampleObject {
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/json/ExampleObjectWithView.java
0 → 100644
View file @
9e2d54fe
/*
* Copyright 2012-2017 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
test
.
json
;
import
com.fasterxml.jackson.annotation.JsonView
;
import
org.springframework.util.ObjectUtils
;
/**
* Example object used for serialization/deserialization with view.
*
* @author Madhura Bhave
*/
public
class
ExampleObjectWithView
{
@JsonView
(
TestView
.
class
)
private
String
name
;
private
int
age
;
public
String
getName
()
{
return
this
.
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
int
getAge
()
{
return
this
.
age
;
}
public
void
setAge
(
int
age
)
{
this
.
age
=
age
;
}
@Override
public
int
hashCode
()
{
return
0
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
obj
==
null
||
obj
.
getClass
()
!=
getClass
())
{
return
false
;
}
ExampleObjectWithView
other
=
(
ExampleObjectWithView
)
obj
;
return
ObjectUtils
.
nullSafeEquals
(
this
.
name
,
other
.
name
)
&&
ObjectUtils
.
nullSafeEquals
(
this
.
age
,
other
.
age
);
}
@Override
public
String
toString
()
{
return
this
.
name
+
" "
+
this
.
age
;
}
static
class
TestView
{
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/json/JacksonTesterIntegrationTests.java
View file @
9e2d54fe
...
...
@@ -16,14 +16,19 @@
package
org
.
springframework
.
boot
.
test
.
json
;
import
java.io.Reader
;
import
java.io.StringReader
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
com.fasterxml.jackson.databind.MapperFeature
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.springframework.core.io.ByteArrayResource
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
...
...
@@ -33,18 +38,27 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
public
class
JacksonTesterIntegrationTests
{
private
JacksonTester
<
ExampleObject
>
simpleJson
;
private
JacksonTester
<
ExampleObjectWithView
>
jsonWithView
;
private
JacksonTester
<
List
<
ExampleObject
>>
listJson
;
private
JacksonTester
<
Map
<
String
,
Integer
>>
mapJson
;
private
ObjectMapper
objectMapper
;
private
static
final
String
JSON
=
"{\"name\":\"Spring\",\"age\":123}"
;
@Before
public
void
setup
()
{
JacksonTester
.
initFields
(
this
,
new
ObjectMapper
());
this
.
objectMapper
=
new
ObjectMapper
();
JacksonTester
.
initFields
(
this
,
this
.
objectMapper
);
}
@Test
public
void
typicalListTest
()
throws
Exception
{
String
example
=
"[
{\"name\":\"Spring\",\"age\":123}
]"
;
String
example
=
"[
"
+
JSON
+
"
]"
;
assertThat
(
this
.
listJson
.
parse
(
example
)).
asList
().
hasSize
(
1
);
assertThat
(
this
.
listJson
.
parse
(
example
).
getObject
().
get
(
0
).
getName
())
.
isEqualTo
(
"Spring"
);
...
...
@@ -59,4 +73,39 @@ public class JacksonTesterIntegrationTests {
.
isEqualTo
(
1
);
}
@Test
public
void
writeWithView
()
throws
Exception
{
this
.
objectMapper
.
disable
(
MapperFeature
.
DEFAULT_VIEW_INCLUSION
);
ExampleObjectWithView
object
=
new
ExampleObjectWithView
();
object
.
setName
(
"Spring"
);
object
.
setAge
(
123
);
JsonContent
<
ExampleObjectWithView
>
content
=
this
.
jsonWithView
.
forView
(
ExampleObjectWithView
.
TestView
.
class
).
write
(
object
);
assertThat
(
content
).
extractingJsonPathStringValue
(
"@.name"
)
.
isEqualTo
(
"Spring"
);
assertThat
(
content
).
doesNotHaveJsonPathValue
(
"age"
);
}
@Test
public
void
readWithResourceAndView
()
throws
Exception
{
this
.
objectMapper
.
disable
(
MapperFeature
.
DEFAULT_VIEW_INCLUSION
);
ByteArrayResource
resource
=
new
ByteArrayResource
(
JSON
.
getBytes
());
ObjectContent
<
ExampleObjectWithView
>
content
=
this
.
jsonWithView
.
forView
(
ExampleObjectWithView
.
TestView
.
class
).
read
(
resource
);
assertThat
(
content
.
getObject
().
getName
())
.
isEqualTo
(
"Spring"
);
assertThat
(
content
.
getObject
().
getAge
()).
isEqualTo
(
0
);
}
@Test
public
void
readWithReaderAndView
()
throws
Exception
{
this
.
objectMapper
.
disable
(
MapperFeature
.
DEFAULT_VIEW_INCLUSION
);
Reader
reader
=
new
StringReader
(
JSON
);
ObjectContent
<
ExampleObjectWithView
>
content
=
this
.
jsonWithView
.
forView
(
ExampleObjectWithView
.
TestView
.
class
).
read
(
reader
);
assertThat
(
content
.
getObject
().
getName
())
.
isEqualTo
(
"Spring"
);
assertThat
(
content
.
getObject
().
getAge
()).
isEqualTo
(
0
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment