如何模拟另一个方法内部调用的方法?

Atu*_*tul 4 c# unit-testing moq

我想用一个例子来解释我的问题.

Class A
{
    Fun1()
    {
        // some code
        B obj2 = new B();
        obj2.Fun2();
    }
}

Class B
{
    Fun2() 
    {
        // some code
    }
}

// Test Class for Class A
Class A_Test
{
    Fun1_Test()
    {
        A obj1 = new A();
        A.Fun1();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里打电话给Fun1哪个电话fun2().我想模拟对fun2()的调用.

我只需要在Fun1()中初始化B类对象,我不想使用构造函数来做.

可以模拟对fun2()的调用吗?

dca*_*tro 6

你不能,因为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
{
    Fun1_Test()
    {
        var bMock = new Mock<IB>();
        bMock.Setup(b => b.Fun2());

        A obj1 = new A();
        A.Fun1(bMock.Object);
    }
}
Run Code Online (Sandbox Code Playgroud)

读:

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

  • @Atul对不起,没有.代码存在缺陷,"A"和"B"之间存在很强的依赖关系,这使得代码无法进行单元测试,并且将来很难维护.*必须*改变. (2认同)