如何模拟在另一个方法中调用的方法
本文关键字:方法 另一个 调用 何模拟 模拟 | 更新日期: 2023-09-27 18:09:59
我想用一个例子来解释我的问题。
class A
{
Fun1()
{
// some code
B obj2 = new B();
obj2.Fun2();
}
}
class B
{
Fun2()
{
// some code
}
}
// Test class for Class A
class A_Test
{
public Fun1_Test()
{
A obj1 = new A();
A.Fun1();
}
}
这里我呼叫Fun1
,它呼叫Fun2()
。我想模拟呼叫Fun2()
。
我只需要在Fun1()
中初始化B类对象,我不想使用构造函数来初始化。
可以模拟调用Fun2()
?
不能,因为Fun2
是在 Fun1
内部创建的对象的实例方法。
由于A
依赖于B
,如果想实现真正的隔离,B
应该被注入到A
中。
你还应该"依赖于抽象",正如依赖倒置原则所宣传的那样。让B
实现一个接口IB
,让A
依赖于IB
。然后,模拟接口IB
并注入该模拟。
class A
{
public Fun1(IB ib) { ib.Fun2(); }
}
interface IB
{
Fun2();
}
class B : IB
{
public Fun2() {}
}
// Test class for Class A
class A_Test
{
public Fun1_Test()
{
var bMock = new Mock<IB>();
bMock.Setup(b => b.Fun2());
A obj1 = new A();
A.Fun1(bMock.Object);
}
}
读:
- 依赖倒置原则
- 依赖注入
这是一个经典的例子,它展示了如果你不能对一个特定的组件进行单元测试,如何重构这个组件!
这就是任何mock框架强制你做的事情——编写解耦的代码。
在你的例子中,类A与b的具体实现紧密耦合。你可以使用依赖注入(就像大多数答案建议的那样)来解耦。通过这样做,您最终会依赖于IB抽象而不是它的任何具体实现。