模拟混凝土 class
Mock a concrete class
我知道模拟具体的 class 是不可能的,只能模拟接口和抽象的 classes。
有什么方法或模式可以避开这个吗?
例如,我有以下 classes 没有实现任何接口。我不想创建一个新的 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 工作。
I know that it is not possible to Mock a concrete class but only
interfaces and abstract classes
使用 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);
}
}
评论:
- C 的构造函数被忽略。
- 调用并测试了 Foo 的真正实现
- 一个 return 值被分配给 C 的私有方法。
- 您的代码无需更改,也不需要额外的间接级别。
我知道模拟具体的 class 是不可能的,只能模拟接口和抽象的 classes。 有什么方法或模式可以避开这个吗?
例如,我有以下 classes 没有实现任何接口。我不想创建一个新的 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 工作。
I know that it is not possible to Mock a concrete class but only interfaces and abstract classes
使用 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);
}
}
评论:
- C 的构造函数被忽略。
- 调用并测试了 Foo 的真正实现
- 一个 return 值被分配给 C 的私有方法。
- 您的代码无需更改,也不需要额外的间接级别。