使用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
相关产品推荐
相关产品推荐

