假设我有以下代码:
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;
}
}