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

时间:2012-09-07 02:56:01

标签: c# unit-testing mocking moq

说我有以下代码:

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,我遇到的问题是该方法正在调用静态方法。

我已阅读this,但我不知道如何在我的案例中实施

2 个答案:

答案 0 :(得分:1)

您必须适当地设计您的代码才能使用Moqs。

通常这意味着广泛的IoC并明确区分您的应用程序层。 Moq存在的主要原因是排除深度依赖性,因此您可以专注于独立于上下文测试您创建的内容。无论有没有Moq,它都会让它变得更容易。

答案 1 :(得分:1)

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; 
    } 
}