Support target type in MockMvcResultMatchers.jsonPath()

This commit introduces an overloaded jsonPath() method to specify a
target type to coerce into for MockMvcResultMatchers.

 - jsonPath(String, Matcher<T>, Class<T>)

Closes gh-23141
This commit is contained in:
RustyTheClone 2019-06-15 20:36:07 +02:00 committed by Sam Brannen
parent 89ebdc766c
commit 72adc3d37e
4 changed files with 41 additions and 2 deletions

View File

@ -204,6 +204,20 @@ public abstract class MockMvcResultMatchers {
return new JsonPathResultMatchers(expression).value(matcher); return new JsonPathResultMatchers(expression).value(matcher);
} }
/**
* An overloaded variant of {@link #jsonPath(String, Matcher)} (Matcher)} that also accepts
* a target type for the resulting value that the matcher can work reliably against.
* <p> This can be useful for matching numbers reliably &mdash; for example,
* to coerce an integer into a double.</p>
*
* @param expression the JSON path expression
* @param targetClass the target class to coerce the matching type into.
* @param matcher a matcher for the value expected at the JSON path
*/
public static <T> ResultMatcher jsonPath(String expression, Class<T> targetClass, Matcher<T> matcher) {
return new JsonPathResultMatchers(expression).value(matcher, targetClass);
}
/** /**
* Access to response body assertions using an XPath expression to * Access to response body assertions using an XPath expression to
* inspect a specific subset of the body. * inspect a specific subset of the body.

View File

@ -24,8 +24,19 @@ package org.springframework.test.context.junit.jupiter.comics;
*/ */
public class Person extends Character { public class Person extends Character {
private final long id;
public Person(String name) { public Person(String name) {
this(0, name);
}
public Person(long id, String name) {
super(name); super(name);
this.id = id;
}
public long getId() {
return id;
} }
} }

View File

@ -67,6 +67,20 @@ class MultipleWebRequestsSpringExtensionTests {
.andExpect(jsonPath("$.name", is("Dilbert"))); .andExpect(jsonPath("$.name", is("Dilbert")));
} }
@Test
void getPerson1() throws Exception {
// Tests for #23121 (Target type in jsonPath method of MockMvcResultMatchers) coercing into Long
this.mockMvc.perform(get("/person/1").accept(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.id", Long.class, is(1L)));
}
@Test
void getPerson2() throws Exception {
// Tests for #23121 (Target type in jsonPath method of MockMvcResultMatchers) coercing into String
this.mockMvc.perform(get("/person/2").accept(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.id", String.class, is("2")));
}
@Test @Test
void getPerson99() throws Exception { void getPerson99() throws Exception {
this.mockMvc.perform(get("/person/99").accept(MediaType.APPLICATION_JSON)) this.mockMvc.perform(get("/person/99").accept(MediaType.APPLICATION_JSON))

View File

@ -31,9 +31,9 @@ class PersonController {
@GetMapping("/person/{id}") @GetMapping("/person/{id}")
Person getPerson(@PathVariable long id) { Person getPerson(@PathVariable long id) {
if (id == 42) { if (id == 42) {
return new Person("Dilbert"); return new Person(id, "Dilbert");
} }
return new Person("Wally"); return new Person(id, "Wally");
} }
} }