排序测试结果如何与测试数据的顺序无关
需求
优惠券排序
已生效的排在前面 未生效的排在后面
已生效的按过期日期升序排序
未生效的按生效日期升序排序
单元测试代码
@Test
public void test_sortCoupons() {
/**
* 准备测试数据
* 1 已生效 明天过期
* 2 已生效 后天过期
* 3 未生效 明天生效
* 4 未生效 后天生效
*/
Coupon coupon1 = new Coupon(1,today,tomorrow);
Coupon coupon2 = new Coupon(2,today,theDayAfterTomorrow);
Coupon coupon3 = ...;
Coupon coupon4 = ...;
/**
* 已生效 2 未生效 4 未生效 3 已生效 1
* 以为这样万无一失 排序要求中的每一点都能测到
*/
List<Coupon> coupons = newArrayList(coupon2, coupon4, coupon3, coupon1);
sortCoupons(coupons);
assertEquals(newArrayList(1,2,3,4),coupons.stream().map(c->c.getId()).collect(toList()));
}
本以为这样万无一失 排序要求中的每一点都能测到 并且测试确实通过了 但是实际的排序代码是有问题的
排序代码
couponList.sort((o1, o2) -> {
Date currentDate = DateTime.now().withTimeAtStartOfDay().toDate();
int value1 = currentDate.before(o1.getStartDate()) ? 1 : 0; //未生效 1 , 已生效 0
int value2 = currentDate.before(o1.getStartDate()) ? 1 : 0; //注意:此行代码有误 o1 --> o2
int result = value1 - value2;
if (result == 0) {
if (value1 == 0) {
// 已生效 比较过期日期
result = o1.getOverDate().compareTo(o2.getOverDate());
} else {
// 未生效 比较生效日期
result = o1.getStartDate().compareTo(o2.getStartDate());
}
}
return result;
});
好像只有这样调整才能暴露问题
/**
* 未生效 4 未生效 3 已生效 2 已生效 1
*/
List<Coupon> coupons = newArrayList(coupon4, coupon3, coupon2, coupon1);
java.lang.AssertionError:
Expected :[1, 2, 3, 4]
Actual :[1, 3, 4, 2]
有没办法 使得任意顺序都能暴露问题呢?即和测试数据的顺序无关呢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论