Junit和EasyMock理解澄清

时间:2010-04-22 04:45:44

标签: java unit-testing junit mocking easymock

现在我正在使用JUnit,我遇到了EasyMock,我理解两者都是出于同样的目的。 我的理解是否正确?

EasyMock对Junit有什么好处?

哪一个更容易配置?

EasyMock有任何限制吗?

请帮我学习

3 个答案:

答案 0 :(得分:7)

当我解释单元测试时,我喜欢将它们描述为一个阶段列表:

  • 测试设置:定义并创建测试所需的所有数据和对象
  • 期望:说明您希望在测试期间执行哪些方法和参数
  • 测试:您要测试的实际行为/方法调用
  • 断言:确保测试结果成功的陈述
  • 测试撕下:消除测试期间发生的任何副作用

jUnit是一个单元测试框架,提供除测试期望以外的所有测试。 Java空间中的替代方案包括:

  • TestNG的
  • 的jtest
  • jBehave(有点)
  • jDave(有点)

其他语言等价物包括:

  • PHP - phpUnit
  • Ruby - Test :: Unit
  • Flash - FlexUnit

模拟的概念增加了Expectations的新阶段,并且由于jUnit在模拟运动之前看到了它的大部分主要开发,这些功能没有被整合到核心中,并且一组工具填补了这个空白。 java空间已经打开了。这些图书馆包括

  • EasyMock的
  • JMock的
  • jMockIt

所有这些库都是对我列出的任何上述单元测试框架的补充,包括jUnit。他们添加了定义模拟对象的能力。模拟对象获得分配给它们的“期望”,然后在断言阶段声明它们。每个模拟库都以不同的方式实现,但主要模型是

  • 录制重播 - EasyMock
  • 期望 - jMock,jMockIt

我个人是Expectations方法的粉丝,它更具说明性,并且不易出错,因为它需要较少的方法来被实现者调用,但这是一种风格偏好,而不是技术偏好。

其他语言(因为他们来自单元测试世界晚于java)在大多数情况下没有这个分离。单元测试库和模拟库是同一个。这是phpunit,rspec的情况。我想jUnit很快就不会在本地融入这个版本,因为已经有了这么多丰富的替代模拟库。

答案 1 :(得分:3)

他们不是一回事

JUnit是一个xUnit测试框架 - 它有一个测试运行器,它遍历测试套件,执行每个自动化单元测试并记录结果。

EasyMock是mock-object framework。它用于替换难以设置的合作者与假人/假货/嘲笑,以帮助专注于我打算测试的行为。
例如如果我的SUT.AuditCustomers()调用DAO.GetCustomer(databasePath),在我的测试中我想关注方法AuditCustomers(),所以我使用的是mockDAO,它不会从数据库中读取客户而是返回已知的/ hardcoded Customer对象易于测试。这也有一个好处,即GetCustomer中的任何错误都不会使AuditCustomers()

的测试失败

答案 2 :(得分:0)

我不确定,但我认为JUnit和EasyMock不是互相排斥,而是应该一起工作。 JUnit的想法是测试给定的方法,因此您希望将其他类的虚拟实例注入其中,以确保JUnit测试完全不依赖于其他类方法。在JUnit中提供模拟对象的目的是由EasyMock和其他类似的模拟对象创建者提供。当使用spring将伪实现注入JUnit时,会使用类似的想法。

EasyMock似乎很有前景,但您应该评估Spring或其他一些代理对象生成器是否适合您的场景。