You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的构造方法和获取方法中处理对象拷贝:

  1. 构造方法内创建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); // 保存副本而非原引用
}
  1. 获取方法返回Date副本
    同时,getOrderDate方法不能直接返回原对象引用,否则外部仍可修改内部状态:
public Date getOrderDate() {
    return new Date(this.orderDate); // 返回副本,避免外部修改内部对象
}

完成上述修改后,外部修改d的内容将不再影响Order内部的orderDate,你的JUnit测试就能得到预期的12。

内容的提问来源于stack exchange,提问作者tynum47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:10:19