论坛首页 Java企业应用论坛

从SpringSideV3.3.4的MAC下测试Bug,想到JsonObject的equal问题

浏览 2081 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-04   最后修改:2010-10-04
这一个阶段的公司任务是给一家国外公司在国内创业做技术支持,对方说希望使用Java EE技术。我马上想到了江南白衣的SpringSide,我很喜欢这个东西,而且刚刚更新,马上Download下来。以前用过SpringSide最早的版本,现在看看更新了好多,好多东西自己还没听说过,非常值得好好研究一下。

SpringSide好是好,不过一看到bat,没有sh,完蛋,打开win本先看看吧。额额,一切非常顺利,迁移到mac上,却出现问题了,modules/core测试不通过,Struts2UtilsTest类中的renderJson()方法有问题;此方法内的后3个assertEquals出现了问题

引用

{"age":10,"name":"foo"}=>{"name":"foo","age":10}

[{"age":10,"name":"foo"},{"age":10,"name":"foo"}]=>[{"name":"foo","age":10},{"name":"foo","age":10}]

[{"age":10,"name":"foo"},{"age":10,"name":"foo"}]=>[{"name":"foo","age":10},{"name":"foo","age":10}]


前者是期望的Json,后者是实际的Json。

奇了怪了,怎么Win和Mac的结果不一样?

首先我认为这里的测试不适合这样写
assertEquals("[{\"age\":10,\"name\":\"foo\"},{\"age\":10,\"name\":\"foo\"}]",response.getContentAsString());

因为Json除了array元素需要顺序,其他元素不需要顺序。也就是说在[{Object1},{Object2}]当中,Object1和Object2是有循序结构的,而Object1{"age":10,"name":"foo"}内部的:age 和:name则不需要循序结构,但并不包括其中的数组。换言之,

{"age":10,"name":"foo"}.should eq {"name":"foo","age":10}
{"age":10,"name":"foo"}{"age":20,"name":"foo2"}.should eq {"name":"foo","age":10}{"name":"foo2","age":20}
{"age":10,"name":"foo"}{"age":20,"name":"foo2"}.should_not eq {"name":"foo2","age":20}{"name":"foo","age":10}
{"age":10,"name":"foo","arr":["1","2"]}{"age":20,"name":"foo2"}.should_not eq {"name":"foo","age":10,"arr":["2","1"]}{"name":"foo2","age":20}


综上所述,判定Json的相等,用String并不合适。
在SpringSide提供的场景,我认为修改策略有2
1》实现一个判定两个JsonString equal的方法
2》直接由JsonString生成两个Object,由Object的equal方法判定

我采用方法2的方式如下
assertEquals(mapper.readValue("{\"name\":\"foo\",\"age\":10}", Object.class), mapper.readValue(response
				.getContentAsString(), Object.class));

   发表时间:2010-12-01  
这个问题太细,没研究过。我只是把mini-web在开发环境中跑起来了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics