如何在c#中使用moq.mmock来模拟调用静态类的方法



假设我有以下代码:

public class NumberClass
{
    public NumberClass()
    {
        DefaultNumber = 1;
    }
    public int DefaultNumber{set;get;}
}
public static class NumberSetup
{
    public static NumberClass GetDefaultNumber()
    {
        return new NumberClass();
    }
}
public class NumberSetupImplementation
{
    int FinalNumber;
    public void IncreaseNumber(int currentNumber)
    {
        FinalNumber = currentNumber + NumberSetup.GetDefaultNumber().DefaultNumber;
    }
}

我想在c#.net中使用moq.mock测试方法NumberSetupImplementation.IncreaseNumber,我面临的问题是该方法正在调用静态方法。

我读过这篇文章,但我不知道如何在我的案例

中实现它

您必须适当地设计代码以利用Moqs的优势。

一般来说,这意味着大量的IoC和应用程序的明显分离层。Moq存在的主要原因是排除了深度依赖,这样您就可以集中精力测试您所创建的内容,而不依赖于上下文。无论有没有Moq,这都是真的,只是让事情变得简单了一点。

Moq在后台使用动态代理,这就是为什么不能使用Moq来模拟静态方法。为了设计可测试性,其中一点是避免使用静态方法。对于您的示例,您可以使用DI注入NumberSetup,或者另一个技巧是使用两个构造函数:

public interface INumberSetup
{
    NumberClass GetDefaultNumber();
}
public class NumberSetup: INumberSetup 
{ 
    public NumberClass GetDefaultNumber() 
    { 
        return new NumberClass(); 
    } 
} 
public class NumberSetupImplementation 
{ 
    private int _finalNumber;
    private INumberSetup _numberSetup;
    public NumberSetupImplementation()
        : this(new NumberSetup())
    {}
    public NumberSetupImplementation(INumberSetup numberSetup)
    {
        _numberSetup = numberSetup;
    }
    public void IncreaseNumber(int currentNumber) 
    { 
        _finalNumber = currentNumber + _numberSetup.GetDefaultNumber().DefaultNumber; 
    } 
}

最新更新