JustMock如何忽略在被测方法中进行的方法调用

时间:2013-06-03 14:12:18

标签: c# unit-testing justmock

我正在使用JustMock来帮助进行单元测试编写,并且已经找到了一些我认为相当简单但无法找到答案的东西。我不能发布任何代码,但我会尽力解释。我想出了一个例子来展示我想要做的事情。我想测试Class1的Close方法,而不调用Class2的CloseConnection方法。我已经尝试在Class2的CloseConnection实例上使用Mock.Arrange,但我相信它特定于你安排的实例。在我设置单元测试和模拟(模拟代码下面的示例代码)然后在Class1的Close方法内部调试它仍然从Class2调用CloseConnection方法我认为因为Class2依赖是在Class1的构造函数内创建的,我没有访问权限直接。

public class Class1
{
    private Class2 instanceOfClass2;

    public Class1()
    {
       instanceOfClass2 = new Class2();
    }

    public void Close()
    {
        // other code here
        instanceOfClass2.CloseConnection(true);
    }
}   

public class Class2
{
    public void CloseConnection(bool persist)
    {
        // Method I don't want executed
    }
}

任何人都知道如何测试Class1的Close方法并忽略使用JustMock调用Class2的CloseConnection方法?

我试过了:

Mock.Arrange(() => instanceOfClass2.CloseConnection(persist)).DoNothing();

以及mocked和nonmocked class2实例以及不同的args(即Arg.IsAny()),但仍无法阻止此方法调用的发生。

重构代码对我来说不是一个选项,所以我无法更改它以注入依赖项,我读到了关于使用justmock构造函数模拟,但它似乎忽略了构造函数而不是让我为其编写不同的构造函数要使用的Class1,以便我可以访问Class2。

有什么想法吗?

更新1:Telerik回到我面前说要尝试使用.IgnoreInstance(),它仍然没有阻止对CloseConnection的调用。等待Telerik的另一个回复。

1 个答案:

答案 0 :(得分:2)

(完全披露:我在Telerik工作)

使用JustMock的最新内部版本我尝试了以下测试,并且启用了探查器后,它成功通过了。请注意,您无法阻止对方法的调用,您只能阻止执行方法的原始主体。

    [TestMethod]
    public void ShouldArrangeFutureCallToMethod()
    {
        // arrange CloseConnection for all future instances of Class2.
        // "new X()" is equivalent to using .IgnoreInstance()
        Mock.Arrange(() => new Class2().CloseConnection(Arg.AnyBool)).DoNothing();

        // act
        var c1 = new Class1();
        c1.Close();
        //success: didn't throw
    }

    public class Class1
    {
        private Class2 instanceOfClass2;

        public Class1()
        {
            instanceOfClass2 = new Class2();
        }

        public void Close()
        {
            // other code here
            instanceOfClass2.CloseConnection(true);
        }
    }

    public class Class2
    {
        public void CloseConnection(bool persist)
        {
            throw new NotImplementedException();
        }
    }