什么是Java中的模拟对象?

我想知道Java中的模拟对象 。 为什么我们要创造它们,它们的用途是什么?

Mock对象是用于unit testing的东西。 如果你有一个对象的方法你想testing,而这些方法依赖于其他对象,你创build一个依赖的模拟,而不是该依赖的实际实例。 这允许你孤立地testing你的对象。

用于创build模拟对象的通用Java框架包括JMock和EasyMock 。 它们通常允许你创build模拟对象的行为,你可以定义,所以当你调用模拟对象的方法时,你确切地知道什么期望(只要返回值和副作用)。

作为一个例子,一个常见的用例可能在MVC应用程序中,在这个应用程序中有一个DAO层(数据访问对象)和一个执行业务逻辑的Controller。 如果你想unit testing控制器,并且控制器依赖于DAO,你可以模拟DAO,将虚拟对象返回给你的控制器。

有一点需要注意的是,它通常是模拟对象实现与他们所嘲讽的对象相同的接口的情况 – 这允许您的代码通过接口types来处理它们,就好像它们是真实事物的实例一样。

嘲笑和模拟对象不是特定于Java。 模拟对象是一种unit testing技术,其中代码块被replace为模拟实际代码的虚拟实现。 这有助于编写针对被testing类所提供function的unit testing。

检查这些文章提供了一个很好的介绍嘲笑的概念:
模拟对象 (PDF)
远程testing:使用模拟对象进行unit testing (PDF)

如果你正在寻找一个Java的unit testing模拟框架,看看: Mockito 。 我发现它对我的unit testing很有用。

模拟对象可以让你模拟和validation真实的对象,而不需要在这些对象中真正运行实际的代码。 你可以设置一个模拟方法调用返回特定的结果,你可以validation一个方法是否被调用,和其他很酷的东西。

Mockito是一个非常简单和直接的Java模拟对象库。

从这里引用: http : //easymock.org/

unit testing是单独testing软件单元。 然而,大多数单位不是单独工作,而是与其他单位合作。 为了单独testing一个单元,我们必须模拟testing中的协作者。 模拟对象是一个合作者的testing导向的替代品。 它被configuration为以简单的方式模拟它所replace的对象。

例如,如果您要testinghttp调用,则需要创build实际的请求对象,并完成所有的依赖关系。 这往往需要很多努力,因此使用模拟对象可以提供更快的path来创build所需对象的准确再现,而不需要很长的依赖链。

模拟对象是在unit testing中使用的对象。 这可以帮助您testing您想要testing的唯一function。 因为所有的依赖关系都可以通过模仿这些依赖对象来实现。 所以如果testing通过,你会确定你的testing单位是正确的。

所以它是创build它们的testing作者。 您可以使用EasyMock作为嘲笑的工具。