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

使用Moq4无法修改方法的byte[]类型入参值,请问有什么解决方案?

问题原因

你的代码无法生效的核心原因是:byte[]属于引用类型,但Moq回调里的buffer参数是原始入参引用的局部副本,你直接执行buffer = new byte[] { ... }只是修改了这个局部变量的指向,不会改变外部原始数组变量的指向,也没有修改原始数组对象内部存储的内容。
你之前参考的List<string>相关实现,本质是直接修改List对象本身的内容(比如调用Add/Clear/Insert等方法),而非给List变量重新赋值,因此可以生效。

解决方案

不要创建新数组赋值给局部参数,而是把期望的内容直接拷贝到传入的原始数组对象中即可,同时可以结合传入的offset和count参数控制写入范围,避免越界。

修改后的核心代码如下:

mock.Setup(so => so.DoSomething(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
    .Callback<byte[], int, int>(
    (buffer, offset, count) => 
    {
        byte[] expectedData = new byte[] { 5, 6, 7, 8, 9 };
        // 将预期数据写入原始数组,从指定偏移量开始,写入长度不超过传入的count限制
        int writeLength = Math.Min(expectedData.Length, count);
        Buffer.BlockCopy(expectedData, 0, buffer, offset, writeLength);
    }
    );

修改后运行测试,断言即可正常通过。

如果你的业务逻辑本身需要让方法返回全新的数组对象,需要把DoSomething的array参数标记为ref或out,此时Moq也有对应的参数处理逻辑,适配后也可以实现需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:03:01