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

如何在无setter的情况下修改私有变量值 并解决单元测试访问问题

解决方案

一、类内部修改balance属性的方法

你当前的private double balance { get; }属于仅带get访问器的自动实现只读属性,仅能在类的构造函数中赋值,普通成员方法无法直接修改,可通过以下两种方式调整:

  • 方案1(最简便):给属性添加私有set访问器
    将属性定义修改为:
    private double balance { get; private set; }
    
    改完后类内部所有成员方法都可以修改balance的值,同时外部依然无法直接访问和修改该属性,符合封装要求。
  • 方案2(保留纯get属性定义):使用底层私有字段支撑
    放弃自动属性,改为手动实现属性的底层存储:
    // 定义私有存储字段
    private double _balance;
    // 只读属性包装底层字段
    private double balance => _balance;
    
    后续在Debit、Deposit等方法中直接修改_balance字段的值即可,属性的只读特性不受影响。

二、单元测试访问私有balance的方法

方案1(最佳实践):新增公开只读余额查询属性

单元测试应当测试类的对外公开接口,你可以给BankAccount类添加一个公开的只读属性来暴露余额:

public double Balance => balance;

修改后你的测试代码直接改为访问Account.Balance即可正常运行:

[TestMethod]
public void DepositTest1()
{
    BankAccount Account = new BankAccount(100, "Baldip Singh");
    Account.Deposit(1);
    Assert.AreEqual(101, Account.Balance);
}

该方案完全符合面向对象封装规则,账户本身也应当提供余额查询的公开功能,适配性最高。

方案2(无需修改原类代码):反射读取私有属性

如果作业要求不能修改BankAccount类的公开接口,可以用反射直接读取私有属性的值,示例代码如下:

[TestMethod]
public void DepositTest1()
{
    BankAccount Account = new BankAccount(100, "Baldip Singh");
    Account.Deposit(1);
    // 反射获取私有属性
    var balanceProperty = typeof(BankAccount).GetProperty("balance", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    double actualBalance = (double)balanceProperty.GetValue(Account);
    Assert.AreEqual(101, actualBalance);
}

方案3:使用InternalVisibleTo特性

如果将balance的访问修饰符改为internal,再在BankAccount项目的程序集信息文件(AssemblyInfo.cs)中添加如下配置,就可以让单元测试项目直接访问internal成员:

[assembly: InternalsVisibleTo("你的单元测试项目的程序集名称")]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:24:03