Java方法隐私泄露修复:JUnit测试未达预期输出排查
问题原因分析
核心问题:引用传递导致对象共享
Java中对象采用引用传递机制,你创建Date d后将其传入Order构造方法时,Order内部只是保存了d对象的引用,而非创建全新的Date副本。这就导致:
- 外部调用
d.setDay(10)时,修改的是内存中同一个Date实例的内容 Order对象b中存储的orderDate与外部的d指向同一个对象,因此b.getOrderDate()拿到的对象的day值会同步变为10
次要问题:setDay方法条件判断错误
你的setDay方法存在逻辑错误:
// 错误写法:用||会导致任何整数都满足条件,完全起不到校验作用 if (day >= 1 || day <= 31)
正确的校验逻辑应该用&&,确保day在合法范围内:
if (day >= 1 && day <= 31)
这个错误不是当前测试失败的直接原因,但会导致后续可能设置非法日期。
修复方案
要解决隐私泄露问题,需在Order的构造方法和获取方法中处理对象拷贝:
- 构造方法内创建Date副本
修改Order的构造方法,不要直接保存传入的Date引用,而是创建新的Date对象。如果你的Date类没有拷贝构造方法,需要先添加:
// 给Date类添加拷贝构造方法 public Date(Date other) { this.month = other.month; this.day = other.day; this.year = other.year; } // 修改Order的构造方法 public Order(Money amount, Date orderDate, String company, String item) { this.orderDate = new Date(orderDate); // 保存副本而非原引用 }
- 获取方法返回Date副本
同时,getOrderDate方法不能直接返回原对象引用,否则外部仍可修改内部状态:
public Date getOrderDate() { return new Date(this.orderDate); // 返回副本,避免外部修改内部对象 }
完成上述修改后,外部修改d的内容将不再影响Order内部的orderDate,你的JUnit测试就能得到预期的12。
内容的提问来源于stack exchange,提问作者tynum47
相关产品推荐
相关产品推荐

