0

我现在有一堂课是这样的:

public class MyClass {

    public void Method1(){
        if (false) {
            Method2();
        }
    }

    public void Method2(){
        //do something here
    }
}

所以 Method2 永远不会被调用(我的代码看起来有点不同,但我有这个 if 子句的计算结果为 false,因此不执行 Method2。通过调试检查它以确定)。我想告诉 RhinoMocks 我希望 Method2 被调用并且测试失败:

MockRepository mock = new MockRepository();
MyClass presenter = mock.PartialMock<MyClass>();

Expect.Call(() => presenter.Method2()).IgnoreArguments();

mock.ReplayAll();
presenter.Method1();
mock.VerifyAll();

...但是测试通过了。

(Expect.Call 中 lambda 表达式的原因是,我的实际 Method2 有参数)

我的问题:

  • 这是在这种情况下进行测试的常用方法吗?(我只是从 RhinoMocks 和一般的模拟框架开始)
  • 为什么测试会通过?
4

2 回答 2

3

正如 Jakob 的评论所证实的那样,PartialMock仅模拟抽象/虚拟方法,因此您的期望实际上并没有做任何事情。

就我个人而言,我通常不会在我正在测试的类中模拟方法。我只是模拟了依赖关系,并通过接口而不是具体的类来表达它们,从而避免了这个问题。

于 2009-03-13T10:06:41.987 回答
0

我认为部分模拟具体类有很多价值。例如,假设您有几个在类中被调用的私有方法。您显然需要在测试之前将它们设为“内部”,但您希望有一种方法来测试它——无需创建新类(在很多情况下这不是正确的解决方案)。

要使此测试失败,您只需使用方法 2 的签名即可:

公共虚拟 void Method2(){}

于 2009-03-13T13:41:34.310 回答