这一个阶段的公司任务是给一家国外公司在国内创业做技术支持,对方说希望使用Java EE技术。我马上想到了江南白衣的SpringSide,我很喜欢这个东西,而且刚刚更新,马上Download下来。以前用过SpringSide最早的版本,现在看看更新了好多,好多东西自己还没听说过,非常值得好好研究一下。
SpringSide好是好,不过一看到bat,没有sh,完蛋,打开win本先看看吧。额额,一切非常顺利,迁移到mac上,却出现问题了,modules/core测试不通过,Struts2UtilsTest类中的renderJson()方法有问题;此方法内的后3个assertEquals出现了问题
[quote]
{"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}][/quote]
前者是期望的Json,后者是实际的Json。
奇了怪了,怎么Win和Mac的结果不一样?
首先我认为这里的测试不适合这样写
因为Json除了array元素需要顺序,其他元素不需要顺序。也就是说在[{Object1},{Object2}]当中,Object1和Object2是有循序结构的,而Object1{"age":10,"name":"foo"}内部的:age 和:name则不需要循序结构,但并不包括其中的数组。换言之,
综上所述,判定Json的相等,用String并不合适。
在SpringSide提供的场景,我认为修改策略有2
1》实现一个判定两个JsonString equal的方法
2》直接由JsonString生成两个Object,由Object的equal方法判定
我采用方法2的方式如下
SpringSide好是好,不过一看到bat,没有sh,完蛋,打开win本先看看吧。额额,一切非常顺利,迁移到mac上,却出现问题了,modules/core测试不通过,Struts2UtilsTest类中的renderJson()方法有问题;此方法内的后3个assertEquals出现了问题
[quote]
{"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}][/quote]
前者是期望的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));