模拟框架对我有什么作用?

Tho*_*hom 4 java mocking

我听说过一些我无法与之交谈的人是jmock的忠实粉丝.我已经完成了以测试为中心的开发多年,因此我浏览了网站并查看了一些文档,但仍然无法弄清楚它有多好.

春天我遇到了同样的问题.如果你已经明白它是什么,那么他们的文档会很好地解释它,所以我不认为jmock是没有价值的.我只是不明白它对我有什么影响.

因此,如果jmock为我提供了模拟存根数据的能力,那么让我们举一个如何做事情的例子,看看jmock会更好.

假设我有我的UI层,在创建窗口小部件时创建窗口小部件和窗口小部件服务,初始化窗口小部件并将其中的部分存储在构成窗口小部件所需的三个表中.

当我写测试时,我就是这样做的.

首先,我重新将hibernate指向我的测试高超音速数据库,这样我就不需要做一堆数据库设置了.Hibernate为我创建了我的表.

我的所有测试都有静态工厂方法,为我构建类的测试实例.我的每个DAO都创建指向测试模式的测试版本.然后我的服务类有一个用测试类生成的DAO构造自己的服务类.

现在,当我运行调用服务的UI控制器的测试时,我正在通过应用程序测试我的代码.当然,这不是进行单元测试时通常需要的完全隔离,但在我看来,它为我提供了更好的单元测试,因为它在所有支持层中一直执行实际代码.

因为在休眠状态下Hypersonic运行缓慢,所以我的所有测试都需要稍长的时间,但我的整个构建仍然在不到五分钟的时间内在较旧的计算机上运行以进行完整的构建和打包,所以我觉得这很可接受.

我如何用jmock做不同的事情?

Mic*_*rdt 6

在您的示例中,有两个接口,其中一个将使用模拟框架进行适当的单元测试:

  • UI层和窗口小部件服务之间的接口 - 用模拟替换窗口小部件服务将允许您单独测试UI层,服务返回手动创建的数据,模拟验证预期的服务调用(没有其他)发生.
  • 小部件服务和DAO之间的接口 - 通过用模拟替换DAO,可以单独测试包含复杂逻辑的任何服务方法.

当然,这不是进行单元测试时通常需要的完全隔离,但在我看来,它为我提供了更好的单元测试,因为它在所有支持层中一直执行实际代码.

这似乎是你问题的核心.答案有很多方面:

  • 如果您没有单独测试组件,则没有单元测试,您需要进行集成测试.如您所见,这些非常有价值,但它们有其缺点
  • 由于他们同时测试更多的东西,他们往往会更频繁地破坏,他们倾向于分成大群(当常见功能存在问题时),当他们这样做时,更难找出实际问题所在
  • 它们在您可以测试的场景中受到更多限制.在集成测试中模拟某些边缘情况可能很困难或不可能.
  • 有时,完整的集成测试无法自动化,因为某些组件不在您的控制之下(例如第三方Web服务)来设置您需要的测试数据.在这种情况下,您甚至可能最终在高级集成测试中使用模拟框架.