如何模拟在另一个方法中调用的方法

本文关键字:方法 另一个 调用 何模拟 模拟 | 更新日期: 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);
    }
}

:

  1. 依赖倒置原则
  2. 依赖注入

这是一个经典的例子,它展示了如果你不能对一个特定的组件进行单元测试,如何重构这个组件!

这就是任何mock框架强制你做的事情——编写解耦的代码。

在你的例子中,类A与b的具体实现紧密耦合。你可以使用依赖注入(就像大多数答案建议的那样)来解耦。通过这样做,您最终会依赖于IB抽象而不是它的任何具体实现。