2015-08-08 71 views
6

我已经使用过JUnit和Mocks,但是我想知道,JUnit中的Mocks和Stubs以及如何在JUnit,Java中使用Stubs有什么区别? 作为具有EasyMock,Mockito等的Mock,Stubs在Java中使用了什么?Java - 如何在JUnit中使用存根

请给出Java中存根的一些示例代码。

谢谢!

+0

希望这【答案】(http://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock -stub)会帮助你 –

+0

我已经阅读过,但没有帮助:( – Hamid

+0

提问示例代码和他们已经完成的现有研究是问责提供者的责任,这个问题需要改进。 –

回答

10

要在junit中使用存根,您不需要任何框架。

如果你想存根一些接口只是实现它:

interface Service { 
    String doSomething(); 
} 

class ServiceStub implements Service { 
    public String doSomething(){ 
     return "my stubbed return"; 
    } 
} 

然后创建新的存根对象,并将其注入到被测对象。

如果你想存根具体类,创建子类并覆盖存根方法:

class Service { 
    public String doSomething(){ 
     // interact with external service 
     // make some heavy computation 
     return "real result"; 
    } 
} 

class ServiceStub extends Service { 
    @Override 
    public String doSomething(){ 
     return "stubbed result"; 
    } 
} 
+0

你的意思是我只是再次编写一些代码,但这次更简单并为此编写测试用例? 一个接口,一个类和一个测试类? 那是它? – Hamid

+0

@哈米德是的,你说得对。如果你想使用模拟,我想有些类需要与外部服务或数据库进行交互。为了避免这些交互,你可以用比原始类更容易的实现方式编写存根。 –

+0

你介意给我举个例子吗?它是如何更容易? – Hamid

12

不要紧,在我看来,框架或技术。模拟和存根可以定义如下。

存根是系统中现有依赖关系(或协作者)的可控替换。通过使用存根,您可以测试代码而不直接处理依赖关系。

模拟对象是系统中的假对象,它决定单元测试是通过还是失败。它通过验证被测对象是否与假对象按预期进行交互一样进行。

也许这些图像可以阐明存根和模拟之间的相互作用。

存根 Stub

模拟 Mock

+0

感谢您的定义;) – Hamid

+0

您的意思是,当我们使用存根时,我们不创建stubClass的对象? – Hamid

+0

根据@Sergey Lagutin的答案。您创建存根以提供给CUT(测试中的代码/类) - 存根是依赖关系替换。 –