问题描述
我正在为 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
为真。