前言
不知不觉假期就结束了,感觉在家的效率比在学校差太多,在学校晚睡,但是能早起,在家想早起是不可能的了,在家有着各种事情的影响,在学校就没有太多影响,回到学校还是很兴奋的。
在本周学习的过程中遇到了这样的问题:
java.lang.AssertionError: JSON path "$.menus" expected:<[club.yunzhi.exam.entity.Menu@5e54c34b]> but was:<{id=-5936975678746039928, name=CgIV, deleted=false, url=1Dzo, roleName=71qs}>
Expected :[club.yunzhi.exam.entity.Menu@5e54c34b]
Actual :{id=-5936975678746039928, name=CgIV, deleted=false, url=1Dzo, roleName=71qs}
解决
本问题出现在后台C层数据断言的测试中,代码如下:
@Test
void getRoleById() throws Exception{
Long id = new Random().nextLong();
Role role = new Role();
Set<Menu> menus = new HashSet<>();
Menu menu = new Menu();
menu.setId(new Random().nextLong());
menu.setName(new RandomString().make(4));
menu.setRoleName(new RandomString().make(4));
menu.setUrl(new RandomString().make(4));
menus.add(menu);
role.setId(id);
role.setName(RandomString.make(4));
role.setMenus(menus);
Mockito.doReturn(role).when(this.roleService).getRoleById(Mockito.eq(id));
String url = this.url + "/" + id.toString();
System.out.println(MockMvcResultMatchers.jsonPath("$.menus"));
System.out.println(role.getMenus());
this.mockMvc.perform(MockMvcRequestBuilders.get(url))
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value(role.getId()))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value(role.getName()))
.andExpect(MockMvcResultMatchers.jsonPath("$.menus").value(role.getMenus()));
}
然后起初是在Debug模式下进行观察:
本来还想着在ResultMatchers离面看一下参数,怎奈里面啥也没有。
然后再瞅一下报错信息:期望的事一个实体数组,实际上却是实体对象,然后换了一种思路:
void getRoleById() throws Exception{
Long id = new Random().nextLong();
Role role = new Role();
Set<Menu> menus = new HashSet<>();
Menu menu = new Menu();
menu.setId(new Random().nextLong());
menu.setName(new RandomString().make(4));
menu.setRoleName(new RandomString().make(4));
menu.setUrl(new RandomString().make(4));
menus.add(menu);
role.setId(id);
role.setName(RandomString.make(4));
role.setMenus(menus);
Mockito.doReturn(role).when(this.roleService).getRoleById(Mockito.eq(id));
String url = this.url + "/" + id.toString();
System.out.println(MockMvcResultMatchers.jsonPath("$.menus"));
System.out.println(role.getMenus());
this.mockMvc.perform(MockMvcRequestBuilders.get(url))
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value(role.getId()))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value(role.getName()))
.andExpect(MockMvcResultMatchers.jsonPath("$.menus[0].id").value(menu.getId()))
.andExpect(MockMvcResultMatchers.jsonPath("$.menus[0].name").value(menu.getName()))
.andExpect(MockMvcResultMatchers.jsonPath("$.menus[0].roleName").value(menu.getRoleName()))
.andExpect(MockMvcResultMatchers.jsonPath("$.menus[0].url").value(menu.getUrl()));
}
既然实体数组里面的实体没办法直接获取,我们可以获取它的属性值,然后同我们给menu实体各个属性的值进行比对。
运行成功。
总结
在解决问题的过程中,要关注控制台给的报错信息,否则会走弯路,耽误好多时间,这种解决办法虽然通过了测试,但绝不是最好的解决办法,限于笔者水平,没有办法直接获取实体进行对比,待以后想到更好的办法后再更新本文吧,感谢 凯强同学在解决问题的过程中给予帮助。
本文作者:河北工业大学梦云智开发团队 张文达
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。