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

这一个阶段的公司任务是给一家国外公司在国内创业做技术支持,对方说希望使用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的结果不一样?

首先我认为这里的测试不适合这样写

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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值