使用 Spring MockMVC 在 JSON 响应中验证 LocalDate
Validate LocalDate in JSON response with Spring MockMVC
我正在尝试验证 Spring MVC 网络服务返回的 JSON 结果中的 LocalDate 对象,但我不知道如何验证。
目前我总是 运行 陷入如下断言错误:
java.lang.AssertionError: JSON path "$[0].startDate" Expected: is
<2017-01-01>
but: was <[2017,1,1]>
我测试的重要部分贴在下面。有什么想法可以让测试通过吗?
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
public class WebserviceTest {
@Mock
private Service service;
@InjectMocks
private Webservice webservice;
private MockMvc mockMvc;
@Before
public void before() {
mockMvc = standaloneSetup(webservice).build();
}
@Test
public void testLocalDate() throws Exception {
// prepare service mock to return a valid result (left out)
mockMvc.perform(get("/data/2017")).andExpect(status().isOk())
.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1))));
}
}
Web 服务 returns 视图对象列表如下所示:
public class ViewObject {
@JsonProperty
private LocalDate startDate;
}
[编辑]
另一个尝试是
.andExpect(jsonPath("$[0].startDate", is(new int[] { 2017, 1, 1 })))
这导致
java.lang.AssertionError: JSON path "$[0].startDate" Expected: is
[<2017>, <1>, <1>]
but: was <[2017,1,1]>
[编辑 2]
返回的 startDate 对象似乎是以下类型:net.minidev.json.JSONArray
我认为在该级别上您正在验证 Json 而不是已解析的对象。所以你有一个字符串,而不是 LocalDate。
所以基本上尝试更改您的代码:
...
.andExpect(jsonPath("$[0].startDate", is("2017-01-01"))));
JSON 响应中的 LocalDate 将类似于 "startDate":
"startDate": {
"year": 2017,
"month": "JANUARY",
"dayOfMonth": 1,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 1,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
因此,您应该检查每个属性,如下所示:
.andExpect(jsonPath("$[0].startDate.year", is(2017)))
.andExpect(jsonPath("$[0].startDate.dayOfMonth", is(1)))
.andExpect(jsonPath("$[0].startDate.dayOfYear", is(1)))
这是要走的路。感谢 'Amit K Bist' 为我指明了正确的方向
...
.andExpect(jsonPath("$[0].startDate[0]", is(2017)))
.andExpect(jsonPath("$[0].startDate[1]", is(1)))
.andExpect(jsonPath("$[0].startDate[2]", is(1)))
这应该通过:
.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1).toString())));
我正在尝试验证 Spring MVC 网络服务返回的 JSON 结果中的 LocalDate 对象,但我不知道如何验证。
目前我总是 运行 陷入如下断言错误:
java.lang.AssertionError: JSON path "$[0].startDate" Expected: is <2017-01-01> but: was <[2017,1,1]>
我测试的重要部分贴在下面。有什么想法可以让测试通过吗?
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
public class WebserviceTest {
@Mock
private Service service;
@InjectMocks
private Webservice webservice;
private MockMvc mockMvc;
@Before
public void before() {
mockMvc = standaloneSetup(webservice).build();
}
@Test
public void testLocalDate() throws Exception {
// prepare service mock to return a valid result (left out)
mockMvc.perform(get("/data/2017")).andExpect(status().isOk())
.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1))));
}
}
Web 服务 returns 视图对象列表如下所示:
public class ViewObject {
@JsonProperty
private LocalDate startDate;
}
[编辑]
另一个尝试是
.andExpect(jsonPath("$[0].startDate", is(new int[] { 2017, 1, 1 })))
这导致
java.lang.AssertionError: JSON path "$[0].startDate" Expected: is [<2017>, <1>, <1>] but: was <[2017,1,1]>
[编辑 2]
返回的 startDate 对象似乎是以下类型:net.minidev.json.JSONArray
我认为在该级别上您正在验证 Json 而不是已解析的对象。所以你有一个字符串,而不是 LocalDate。
所以基本上尝试更改您的代码:
...
.andExpect(jsonPath("$[0].startDate", is("2017-01-01"))));
JSON 响应中的 LocalDate 将类似于 "startDate":
"startDate": {
"year": 2017,
"month": "JANUARY",
"dayOfMonth": 1,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 1,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
因此,您应该检查每个属性,如下所示:
.andExpect(jsonPath("$[0].startDate.year", is(2017)))
.andExpect(jsonPath("$[0].startDate.dayOfMonth", is(1)))
.andExpect(jsonPath("$[0].startDate.dayOfYear", is(1)))
这是要走的路。感谢 'Amit K Bist' 为我指明了正确的方向
...
.andExpect(jsonPath("$[0].startDate[0]", is(2017)))
.andExpect(jsonPath("$[0].startDate[1]", is(1)))
.andExpect(jsonPath("$[0].startDate[2]", is(1)))
这应该通过:
.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1).toString())));