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

本文关键字:方法 内部 调用 何忽略 JustMock | 更新日期: 2023-09-27 18:16:54

我正在使用JustMock来帮助编写单元测试,并且已经得到了一些我认为相当简单但无法找到答案的东西。我不能张贴任何代码,但我会尽我所能解释。我举了一个例子来说明我要做的。我想测试Class1的Close方法,而不调用Class2的CloseConnection方法。我试过使用Mock。在Class2的CloseConnection的一个实例上进行安排,但我相信这是特定于你在哪个实例上进行安排的。在我设置了单元测试和模拟(示例代码下面的模拟代码)之后,然后在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方法,并忽略调用Class2的CloseConnection方法使用JustMock?

I have try:

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

以及模拟和非模拟的class2实例和不同的参数(例如,Arg.IsAny()),但仍然不能阻止该方法调用的发生。

重构代码对我来说不是一个选项,所以我不能改变它来注入依赖,我用justmock阅读了构造函数mock,但它似乎忽略了构造函数,而不是让我为Class1编写一个不同的构造函数,以便我可以访问Class2。

任何想法?

update 1: Telerik回来告诉我,说尝试使用。ignoreinstance(),这仍然不能阻止对CloseConnection的调用。等待Telerik的另一个响应。

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

(全面披露:我在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();
        }
    }