【问题标题】:MockMvc perform, array response assertion failMockMvc 执行,数组响应断言失败
【发布时间】:2021-08-26 18:57:30
【问题描述】:

我正在为 Spring Boot 实施集成测试。我的一个端点归还所有用户,甚至是已删除的用户。这里deleted意味着AppUser实体上的deleted布尔属性设置为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,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":4,"username":"ablabman@account.com","fullName":"Alpha Beta Lab Manager","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[{"id":1,"key":"alab","name":"Alpha Lab","deleted":false,"createdAt":"2021-06-09","updatedAt":null,"labManagerUsernames":["alabman@account.com","ablabman@account.com"]},{"id":2,"key":"blab","name":"Beta Lab","deleted":false,"createdAt":"2021-06-09","updatedAt":null,"labManagerUsernames":["blabman@account.com","ablabman@account.com"]}]},{"id":10,"username":"ablabuser@account.com","fullName":"Alpha Beta Lab User","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":5,"username":"alabadmin@account.com","fullName":"Alpha Lab Admin","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":2,"username":"alabman@account.com","fullName":"Alpha Lab Manager","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[{"id":1,"key":"alab","name":"Alpha Lab","deleted":false,"createdAt":"2021-06-09","updatedAt":null,"labManagerUsernames":["alabman@account.com","ablabman@account.com"]}]},{"id":8,"username":"alabuser@account.com","fullName":"Alpha Lab User","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":1,"username":"aman@account.com","fullName":"Account Manager","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[{"id":1,"role":"ACCOUNT_MANAGER"}],"managedLabs":[]},{"id":6,"username":"blabadmin@account.com","fullName":"Beta Lab Admin","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[]},{"id":3,"username":"blabman@account.com","fullName":"Beta Lab Manager","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"managedLabs":[{"id":2,"key":"blab","name":"Beta Lab","deleted":false,"createdAt":"2021-06-09","updatedAt":null,"labManagerUsernames":["blabman@account.com","ablabman@account.com"]}]},{"id":9,"username":"blabuser@account.com","fullName":"Beta Lab User","deleted":false,"labsAsUser":[],"labsAsAdmin":[],"roles":[],"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,false,false,false,false,false,false,false]>)
Expected :[<true>] 
Actual   :a net.minidev.json.JSONArray (<[false,true,false,false,false,false,false,false,false,false,false]>)
...

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

【问题讨论】:

    标签: spring-boot integration-testing spring-boot-test hamcrest mockmvc


    【解决方案1】:

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

    但是, 测试用例没有任何价值,即使它与arrayContainingInAnyOrder(true,false) 一起使用。

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

    【讨论】:

    • arrayContainingInAnyOrder 也失败:预期:[, ] 以任何顺序实际:a net.minidev.json.JSONArray ()。但我会接受你的建议,因为它更具体
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多