MockObjects的选择:EasyMock与JMock的比较
本文假设读者已经了解了MockObjects的使用目的和基本方式,不对MockTest之类的技术作过多解释。仅提醒一句:“不要测试你的MockObjects”。
本文作为一个评测结果的同时,也可以作为EasyMock和jMock的简短教程。他们本身都很易用,可惜带的示例过于复杂,都用了过多的模式。看过本文的例子,相信就可以从容的在项目中使用了。
Java中常用的MockObjects有EasyMock和jMock等。其中EasyMock开发较早,已经出了1.1版本,而jMock前几天才刚推出了1.0 final。作为刚成熟的小弟弟,jMock有什么竞争实力呢?
本比较针对于以下几个方面,代码请见附件。
1 是否能够对具体类进行模拟(当然,对接口模拟是基本功能)
2 是否能够对方法名,参数,返回值进行动态控制
3 基本代码行数
4 是否能够对具有构造参数的具体类模拟
现在比较开始了。首先制作若干测试文件,很简单。要模拟的有一个接口和一个具体类,叫做TheInterfaceToMock和TheClassToMock,另外,提供方法SampleReturn sampleMethod(Parameter p);以及同名无参数方法。
第一个测试是针对TheInterfaceToMock,提供ParameterImpl和SampleReturnImpl作为期待的参数和返回值。
jMock代码如下:
public class JMockUsage extends MockObjectTestCase {
public void testReturnValueWithParemeter(){
// 构造Mock控制器
Mock m = new Mock(TheInterfaceToMock.class);
// 这是要测试MockObject
TheInterfaceToMock mock = (TheInterfaceToMock) m.proxy();
// 期待的返回值
SampleReturn sr = new SampleReturnImpl();
// 期待的参数
Parameter p = new ParameterImpl();
// 控制器,期待一次,方法sampleMethod,参数等于p(equals),将返回sr
m.expects(once()).method("sampleMethod").with(eq(p))
.will (returnValue(sr));
// 正式执行mockobject
SampleReturn ret = mock.sampleMethod(new ParameterImpl());
// 确定返回值是相同的
assertSame(sr,ret);
}
}
相同功能的easyMcok代码如下:
public class EasyMockUsage extends TestCase {
public void testReturnValueWithParameter(){
// 构造mock控制器
MockControl control =MockControl.createControl(TheInterfaceToMock.class);
// 这是要测试的MockObject
TheInterfaceToMock mock = (TheInterfaceToMock) control.getMock();
// 这是要返回的值
SampleReturn sr = new SampleReturnImpl();
// 这是要传入的参数
Parameter p = new ParameterImpl();
// 恢复到记录(record)状态
control.reset();
// 首先记录sampleMethod方法
mock.sampleMethod(p);
// 设定该方法的返回值
control.setReturnValue(sr);
// 切换状态为回复(reply)
control.replay();
// 正式执行mock object的方法,明显的,参数值是equals而不是same
SampleReturn ret = mock.sampleMethod(new ParameterImpl());
// 确定返回值是需要的值
assertSame(sr,ret);
}
从上面的代码可以看到,同样的功能,二者的行数相差3行。其主要原因,就是easyMcok的Mock机制是基于状态,首先是录制状态,记录下来待测的方法和参数,返回值等,然后切换为回复状态。而jMock没有切换这一步,直接将参数返回值用一句话写出来。确实是一句话:期待一次,方法sampleMethod,参数等于p(equals),将返回sr。其中的一些辅助函数,例如returnValue,eq等等,位于父类MockTestCase。
结论:
1 如果不能提供MockTestCase作为父类,请使用EasyMock
2 如果需要批量或动态生成测试,请使用更规则的jMock
3 如果喜欢看起来行数少一些,请用jMock
4 如果对状态切换看不顺眼,请用Mock
分享到:
相关推荐
无论是JMock还是EasyMock,都可以方便地与JUnit结合使用。通过在JUnit测试类中引入模拟对象,可以编写出隔离性好、易于理解的测试用例。在测试中,可以使用`@Before`和`@After`注解来初始化和清理模拟对象,确保每个...
同时,jMock也可以与EasyMock等其他模拟框架协同工作,提供更丰富的测试策略。 总结来说,jMock 2.5.1是一个强大的模拟工具,它使开发者能够在单元测试中有效地控制和验证对象行为,提高测试覆盖率和代码质量。通过...
JMock可以与其他单元测试框架如JUnit、TestNG等无缝集成,提供更加全面的测试支持。它也可以与Mockito、PowerMock等其他模拟库一起使用,以应对更复杂的测试需求。 总结来说,JMock是一个强大且灵活的Java模拟工具...
Google Mock(简称gmock)是Google在2008年推出的一套针对C++的Mock框架,它灵感取自于jMock、EasyMock、harcreat。它提供了以下这些特性:轻松地创建mock类支持丰富的匹配器(Matcher)和行为(Action)支持有序、...
JMock可以与多种测试框架集成,如JUnit、TestNG等,也可以与其他模拟库如EasyMock、Mockito配合使用,以满足不同测试需求。 总之,JMock是Java开发者进行单元测试的重要工具,它通过提供模拟和预期机制,帮助确保...
easymock.jar is a software testing tool, which has a lot in common wiht Jmock
jMock可以与Mockito、EasyMock等其他模拟框架配合使用,形成互补,提供更全面的测试解决方案。同时,它也可以与Mockrunner、PowerMock等工具结合,用于模拟静态方法、final类等特殊情况。 总结来说,jMock 2.4.0-...
JMock通常与Mockito、EasyMock等其他Java模拟框架相比较。虽然它们的目标相似,但JMock更专注于模拟对象的行为和交互,而不仅仅是方法调用。此外,JMock使用领域特定语言(DSL)来定义期待,使得代码更具可读性。 *...
JMock是针对Java平台的一个开源测试工具,它基于EasyMock库,提供更高级别的API来创建和控制模拟对象。JMock使得测试更加灵活,通过模拟对象的行为,可以专注于测试代码逻辑,而无需依赖于外部系统或复杂的环境设置...
给大家介绍在测试中使用的利器googlemock,它是Google在2008年发布的一套针对C++的Mock框架,与googletest吸取JUnit的精华一样,的它灵感同样来自去Java社区的JMock、EasyMock等Mock思想。 更多关于google...
JavaHamcrest 根据。 什么是Hamcrest? Hamcrest是一个匹配器库,可以将其组合以创建灵活的测试意图表达。 它们也已用于其他目的。 资料下载 ...同时,感谢所有在DynaMock,nMock,jMock,EasyMock和
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.2.1/hamcrest-integration-1.2.1.jar
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.0/hamcrest-integration-1.0.jar
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.1/hamcrest-integration-1.1.jar
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.2/hamcrest-integration-1.2.jar
提供Hamcrest和其他测试工具之间的集成,包括JUnit(3和4),TestNG,jMock和EasyMock。 org.hamcrest/hamcrest-integration/1.3.RC2/hamcrest-integration-1.3.RC2.jar
受jMock,EasyMock和Hamcrest的启发,并在设计时考虑了C ++的细节,它可以帮助您获得更好的系统设计并编写更好的测试。 Google模拟: 提供了用于定义模拟的声明性语法, 可以轻松定义部分(混合)模拟,它们是真实...
与EasyMock不同,JMock允许开发者基于特定的顺序和条件来定义模拟对象的行为,这使得测试更加灵活和精确。在TDD过程中,JMock可以帮助我们精确控制测试环境,确保测试的覆盖性和准确性。 3. MockObjects:Mock...