2014-06-24 44 views
3

我想用一个例子来解释我的问题。如何嘲笑在另一种方法内调用的方法?

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(); 
    } 
} 

在这里,我呼吁Fun1这就要求fun2()。我想模拟调用fun2()。

我需要在Fun1()中只对类B对象进行初始化,我不想用构造函数做它。

有可能模拟调用fun2()?

+1

不要使用直接依赖使用依赖注入。如果你先阅读SOLID原则会更好。 – loop

+0

对于模拟类B,您必须将它的模拟实现传递给类A.通过您的方式,您无法完成它。这是使用接口而不是特定实现的一个原因。 –

回答

5

你不能,因为Fun2内部创建对象的实例方法Fun1

由于A取决于BB应该注入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); 
    } 
} 

阅读:

  1. Dependency Inversion Principle
  2. Dependency Injection
+0

如果你在这个例子中使用接口会更好。 – loop

+0

@loop是的,我删除了*其他*建议,因为它可能会鼓励读者采取最快的路径,而不是正确的路径。 – dcastro

+0

感谢您的建议。但不幸的是,我不允许在这段代码中进行修改,尽管我需要为它编写一个测试方法。是否有任何其他方式来测试Fun1()? – Atul

1

经典例子说明如何,如果你不能单元测试特定组件,重构组件!

这就是爱哪里有什么嘲讽框架强制你做 - 写分离的代码。

在您的示例中,类A与B的具体实现紧密耦合。您可以使用(如大多数答案所示)依赖注入来解耦它。通过这样做,您最终将取决于IB抽象,而不是其任何具体实现。