用Java创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?
当前回答
我们在工作中大量使用EasyMock和EasyMock类扩展,并且对它非常满意。它基本上能满足你所有的需求。看一下文档,有一个非常好的例子,它向您展示了EasyMock的所有特性。
其他回答
我是PowerMock的创建者,所以显然我必须推荐它!: -)
PowerMock扩展了EasyMock和Mockito,具有模拟静态方法、final方法甚至私有方法的能力。EasyMock支持已经完成,但是Mockito插件还需要一些工作。我们还计划添加JMock支持。
PowerMock并不打算取代其他框架,而是可以在其他框架不允许模拟的复杂情况下使用它。PowerMock还包含其他有用的特性,例如抑制静态初始化器和构造函数。
我开始通过JMock使用mock,但最终过渡到使用EasyMock。EasyMock就是这样——更简单——并提供了一种感觉更自然的语法。从那以后我就没换过。
JMockit项目网站包含大量当前模拟工具包的比较信息。
特别是,请查看特性比较矩阵,其中包括EasyMock、jMock、Mockito、unitil Mock、PowerMock,当然还有JMockit。我尽量让它保持准确和最新。
我们在工作中大量使用EasyMock和EasyMock类扩展,并且对它非常满意。它基本上能满足你所有的需求。看一下文档,有一个非常好的例子,它向您展示了EasyMock的所有特性。
模拟的最佳解决方案是让机器通过自动化的基于规范的测试来完成所有工作。对于Java,请参阅函数式Java库中包含的ScalaCheck和Reductio框架。使用基于规范的自动化测试框架,您可以提供被测试方法的规范(关于它的属性应该为真),框架自动生成测试和模拟对象。
例如,下面的属性测试Math。求任意正数n方的平方根是否等于n。
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
当您调用propSqrt.check()时,ScalaCheck会生成数百个整数,并为每个整数检查您的属性,还会自动确保边缘情况被很好地覆盖。
尽管ScalaCheck是用Scala编写的,并且需要Scala编译器,但是用它来测试Java代码很容易。Functional Java中的Reductio框架是相同概念的纯Java实现。
推荐文章
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- 单元测试反模式目录
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?