模拟一个具体的类

本文关键字:一个 模拟 | 更新日期: 2023-09-27 18:05:59

我知道模拟具体类是不可能的,只能模拟接口和抽象类。有什么方法或模式可以避开这件事吗?

例如,我有以下不实现任何接口的类。我不想创建一个新的C实例,因为它会在我的单元测试中花费很多时间,我怎么能模拟它并对Foo()进行单元测试?
public class A
{
    public virtual void Foo(){}
}
public class C:A
{
    public C()
    {
        // construction takes lot of time    
    }
    public override void Foo()
    {
    }
}

谢谢

模拟一个具体的类

免责声明我在Typemock工作。

我知道这是不可能的模拟一个具体的类,但只能接口和抽象类

使用Typemock Isolator,你可以模拟任何东西,从抽象类和接口到密封类和静态类。

我稍微改变了一下你的例子:

public class A
{
    public virtual int Foo() { return 0; }
}
public class C : A
{
    public C()
    {
        // construction takes lot of time    
    }
    private int Bar()
    {
        return 3;
    }
    public override int Foo()
    {
        return Bar() + 1;
    }
}
[TestClass] 
public class Collections
{
    [TestMethod]
    public void FakingWithIsolatorExample()
    {
        var fakeC = Isolate.Fake.Instance<C>();
        Isolate.WhenCalled(() => fakeC.Foo()).CallOriginal();
        Isolate.NonPublic.WhenCalled(fakeC, "Bar").WillReturn(10);
        int result = fakeC.Foo();
        Assert.AreEqual(11, result);
    }
}

的评论:

  1. C的因子被忽略。
  2. Foo的实际实现被调用和测试
  3. 给c的私有方法分配了一个返回值。
  4. 不需要更改代码和额外的间接级别。