我最近一直在进行单元测试,并且已经使用MOQ框架和MS Test成功地模拟了各种场景。我知道我们无法测试私有方法,但我想知道是否可以使用MOQ模拟静态方法。
MOQ(和其他DynamicProxy基础的嘲笑框架)无法嘲笑任何不是虚拟或抽象方法。
密封/静态类/方法只能与基于探查API工具伪造,像Typemock(商业)或Microsoft痣(免费,被称为假货在Visual Studio 2012旗舰版/二千〇一十五分之二千〇一十三)。
另外,您可以重构设计以抽象化对静态方法的调用,然后通过依赖注入将这种抽象提供给您的类。然后,您不仅会有更好的设计,而且可以使用Moq等免费工具进行测试。
可以使用允许可测试性的通用模式,而无需完全使用任何工具。请考虑以下方法:
public class MyClass { public string[] GetMyData(string fileName) { string[] data = FileUtil.ReadDataFromFile(fileName); return data; } }
除了尝试模拟之外FileUtil.ReadDataFromFile,您可以将其包装在一个protected virtual方法中,如下所示:
FileUtil.ReadDataFromFile
protected virtual
public class MyClass { public string[] GetMyData(string fileName) { string[] data = GetDataFromFile(fileName); return data; } protected virtual string[] GetDataFromFile(string fileName) { return FileUtil.ReadDataFromFile(fileName); } }
然后,在您的单元测试中,派生MyClass并调用它TestableMyClass。然后,您可以覆盖该GetDataFromFile方法以返回您自己的测试数据。
MyClass
TestableMyClass
GetDataFromFile
希望能有所帮助。