2

仍然现在我正在使用 JUnit,我遇到了 EasyMock,我知道两者都是出于相同的目的。我的理解正确吗?

EasyMock 与 Junit 相比有哪些优势?

哪一个更容易配置?

EasyMock 有任何限制吗?

请帮我学习

4

3 回答 3

7

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

  • 测试设置:定义和创建测试所需的所有数据和对象
  • Expectations :说出你希望在测试期间执行哪些方法和参数
  • 测试:您要测试的实际行为/方法调用
  • 断言:确保测试结果成功的语句
  • Test Tear down : 销毁测试过程中发生的任何副作用

jUnit 是一个单元测试框架,提供除期望阶段之外的所有测试。Java 领域的替代方案包括:

  • 测试NG
  • 测试
  • jBehave(有点)
  • jDave(有点)

其他语言等价物包括:

  • PHP - phpUnit
  • Ruby - 测试::单元
  • 闪存 - FlexUnit

模拟的概念是增加了新阶段的期望,并且由于 jUnit 在模拟运动之前看到了它的大部分主要开发,因此这些功能没有被合并到核心中,以及一组工具来填补 Java 空间中的空白已经打开了。这些库包括

  • EasyMock
  • 模拟
  • jMockIt

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

  • 录制回放 - EasyMock
  • 期望 - jMock, jMockIt

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

其他语言(因为它们比 java 更晚才进入单元测试世界)在很大程度上没有这种分离。单元测试库和模拟库是一回事。在 phpunit、rspec 中就是这种情况。我想 jUnit 短期内不会在本机合并它,因为已经有如此丰富的替代模拟库可用。

于 2010-04-23T02:54:53.883 回答
3

它们不是同一件事

JUnit 是一个xUnit测试框架——它有一个测试运行程序,可以循环您的测试套件,执行每个自动化单元测试并记录结果。

EasyMock 是一个模拟对象框架。它用于用假人/假货/模拟物替换难以设置的协作者,以帮助专注于我打算测试的行为。
例如,如果我的 SUT.AuditCustomers() 调用 DAO.GetCustomer(databasePath),在我的测试中我想专注于方法 AuditCustomers(),所以我会使用一个不从数据库中读取客户而是返回的 mockDAO已知/硬编码的客户对象,以便于测试。这还有一个好处是 GetCustomer 中的任何错误都不会通过 AuditCustomers() 的测试

于 2010-04-22T05:03:37.673 回答
0

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

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

于 2010-04-22T05:03:50.060 回答