Spring MVC 使用Spring MockMVC验证JSON响应中的LocalDate

icomxhvb  于 2022-11-14  发布在  Spring
关注(0)|答案(5)|浏览(173)

我试图验证SpringMVC Web服务返回的JSON结果中的LocalDate对象,但我不知道如何验证。
目前我总是遇到如下Assert错误:
java.lang.AssertionError:JSON路径“$[0].startDate”预期值:〈<2017-01-01>[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服务返回一个视图对象列表,如下所示:

public class ViewObject {

    @JsonProperty
    private LocalDate startDate;
}

[编辑]
另一个尝试是

.andExpect(jsonPath("$[0].startDate", is(new int[] { 2017, 1, 1 })))

这导致了
java.lang.AssertionError:JSON路径“$[0].startDate”预期值:是[<2017>,<1>,<1>]但是:是〈[2017,1,1]〉

  • [edit 2]* 返回的startDate对象的类型似乎是:net.minidev.json.JSONArray
tvokkenx

tvokkenx1#

这就是要走的路。感谢“阿米特·K·比斯特”为我指明了正确的方向

...
.andExpect(jsonPath("$[0].startDate[0]", is(2017)))
.andExpect(jsonPath("$[0].startDate[1]", is(1)))
.andExpect(jsonPath("$[0].startDate[2]", is(1)))
ds97pgxw

ds97pgxw2#

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)))
unftdfkk

unftdfkk3#

这应该通过:

.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1).toString())));
rseugnpd

rseugnpd4#

因为它需要一个值列表,所以可以这样使用它。

.andExpect(jsonPath("$[0].startDate", is(List.of(2022, 1, 1))))
x6492ojm

x6492ojm5#

我认为在那个层次上你验证的是Json而不是解析的对象,所以你有一个字符串,而不是一个LocalDate。
因此,基本上可以尝试在以下代码中更改代码:

...
.andExpect(jsonPath("$[0].startDate", is("2017-01-01"))));

相关问题