MockMvc 执行,数组响应断言失败

问题描述

我正在为 Spring Boot 实施集成测试。我的一个端点返回所有用户,甚至是已删除用户。此处已删除意味着已删除的布尔属性在 AppUser 实体上设置为 true(~软删除)。 端点工作正常,我已经用 Postman 手动测试过(您可以在响应下方看到)。代码

    @Test
    void testGetAllAppUsers_whenAuthorizedOnlyActiveFalse_gotDeletedUser() throws Exception {
        String token = jwtProvider.generatetoken(TestUtils.ACCOUNT_MANAGER_USERNAME);
        String url = "/api/account/user";
        mvc.perform(get(url)
                    .header("Authorization",token)
                    .param("only-active","false"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$[*].deleted").value(Matchers.arrayContaining(true)));
    }

回复

...
             Body = [{"id":7,"username":"ablabadmin@account.com","fullName":"Alpha Beta Lab Admin","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":11,"username":"ablabdeleteduser@account.com","fullName":"Alpha Beta Lab Deleted User","deleted":true,{"id":4,"username":"ablabman@account.com","fullName":"Alpha Beta Lab Manager","managedLabs":[{"id":1,"key":"alab","name":"Alpha Lab","createdAt":"2021-06-09","updatedAt":null,"labManagerUsernames":["alabman@account.com","ablabman@account.com"]},{"id":2,"key":"blab","name":"Beta Lab","labManagerUsernames":["blabman@account.com","ablabman@account.com"]}]},{"id":10,"username":"ablabuser@account.com","fullName":"Alpha Beta Lab User",{"id":5,"username":"alabadmin@account.com","fullName":"Alpha Lab Admin","username":"alabman@account.com","fullName":"Alpha Lab Manager",{"id":8,"username":"alabuser@account.com","fullName":"Alpha Lab User",{"id":1,"username":"aman@account.com","fullName":"Account Manager","roles":[{"id":1,"role":"ACCOUNT_MANAGER"}],{"id":6,"username":"blabadmin@account.com","fullName":"Beta Lab Admin",{"id":3,"username":"blabman@account.com","fullName":"Beta Lab Manager","managedLabs":[{"id":2,{"id":9,"username":"blabuser@account.com","fullName":"Beta Lab User","managedLabs":[]}]
    Forwarded URL = null
   Redirected URL = null
          Cookies = []


java.lang.AssertionError: JSON path "$[*].deleted"
Expected: [<true>] 
     but: was a net.minidev.json.JSONArray (<[false,true,false,false]>)
Expected :[<true>] 
Actual   :a net.minidev.json.JSONArray (<[false,false]>)
...

我尝试了许多其他参数:"true"false 我已经尝试了 contains 方法,并且我已经尝试使用 "$[*].username" 正则表达式和现有用户名,但每次我得到断言错误。 你能帮我么?肯定有我想念的东西。也欢迎任何建议,因为我在 Spring 集成测试方面相对较新。提前致谢!

解决方法

arrayContainingInAnyOrder(true,false) 在这种情况下应该可以工作。

但是, 测试用例不会有任何价值,即使它适用于 arrayContainingInAnyOrder(true,false)

如您所见,[*].deleted 为响应中存在的所有对象返回值 deleted。测试必须验证特定值。 例如,如果您期望第一个用户应该有 true,则断言 $.[?(@.id ==1)].deleted 为真。