1.被测类
在被测类中添加一个返回真实实例的虚工厂方法GetManager(),并代码IsValidLogFileName()中使用该工厂方法。
public class LogAnalyzerUsingFactoryMethod
{
public bool IsValidLogFileName(string fileName)
{
return GetManager().IsValid(fileName) && Path.GetFileNameWithoutExtension(fileName).Length > 6; ;
}
protected virtual IExtensionManager GetManager()
{
return new FileExtensionManager();
}
}
2.间接层
作为间接层的新类,继承自被测类,重写虚方法GetManager()以获取实例。Manager为公共字段,用于注入桩对象。
public class TestableLogAnalyzer : LogAnalyzerUsingFactoryMethod
{
public IExtensionManager Manager;
//返回配置的实例
protected override IExtensionManager GetManager()
{
return Manager;
}
}
3.测试代码
测试代码中首先新建桩对象,然后新建间接层实例,设置公共字段Manager为桩对象。
[TestFixture]
public class LogAnalyzerTests
{
[Test]
public void OverrideTest()
{
StubExtensionManager stub = new StubExtensionManager();
stub.ShouldExtensionBeValid = true;
//被测类派生出的类
TestableLogAnalyzer logan = new TestableLogAnalyzer();
logan.Manager = stub;
bool result = logan.IsValidLogFileName("s.log");
Assert.IsFalse(result, "File name with less than 5 chars should have failed the method, even if the extension is supported.");
}
}