RhinoMocks和抽象基类

时间:2011-12-27 23:18:39

标签: c# rhino-mocks

我正在尝试使用System.Security.Cryptography.RandomNumberGenerator进行模拟,遗憾的是它是一个抽象基类,而不是一个接口。

当我尝试在Rhino.Mocks中设置期望时:

int iterations = 10 ;
byte[] fakeHash = {0, 1, 3, 6};
mocks.Get<HashAlgorithm>().Expect(x => x.ComputeHash(Arg<byte[]>.Is.NotNull))
    .Return(fakeHash).Repeat.Times(iterations);

我从ABC中抛出异常:

  

测试方法   Tests.Utils.FooTest.BarTest   抛出异常:System.ArgumentNullException:Value不能为null。   参数名称:缓冲区at   System.Security.Cryptography.HashAlgorithm.ComputeHash(Byte [] buffer)

ABC强制执行传递参数的不变量为null,但Rhino传递的是null。请注意,这是作为期望/存根 设置的一部分,当它作为测试的一部分被调用时。

我如何解决这个问题,但仍然可以获得调用该方法的期望,以及我想要的假结果?当然,我可以创建自己的模拟课程,但我更愿意找到一种不需要的方法。

感谢。

2 个答案:

答案 0 :(得分:2)

抛出异常,因为ComputeHash不是虚拟成员。您只能在虚拟或接口方法上设置期望值。 如果你需要模拟这个类,你需要创建一个包含虚拟成员的包装器并模拟它而不是真正的类。

请注意,如果您有一个resharper - 这是微不足道的,只需创建一个类,将HashAlgorithm作为一个字段并选择Generate / Delegating Methods。然后选择模拟所需的方法并将其设置为虚拟:)

答案 1 :(得分:0)

不幸的是,HashAlgorithm.ComputeHash方法不是虚拟的,不能被RhinoMocks嘲笑。

public byte[] ComputeHash(Stream inputStream) { ... }
public byte[] ComputeHash(byte[] buffer) { ... }
public byte[] ComputeHash(byte[] buffer, int offset, int count)