用Java创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?


当前回答

我喜欢JMock,因为您能够设置期望。这与检查在某些模拟库中是否调用了某个方法完全不同。使用JMock可以编写非常复杂的期望。看那个jmock骗子。

其他回答

我们在工作中大量使用EasyMock和EasyMock类扩展,并且对它非常满意。它基本上能满足你所有的需求。看一下文档,有一个非常好的例子,它向您展示了EasyMock的所有特性。

我喜欢JMock,因为您能够设置期望。这与检查在某些模拟库中是否调用了某个方法完全不同。使用JMock可以编写非常复杂的期望。看那个jmock骗子。

模拟的最佳解决方案是让机器通过自动化的基于规范的测试来完成所有工作。对于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实现。

对于一些不同的东西,您可以使用JtestR中组合的JRuby和Mocha,以表达性和简洁的Ruby为您的Java代码编写测试。这里有一些有用的JtestR模拟示例。这种方法的一个优点是模拟具体类非常简单。

JMockit项目网站包含大量当前模拟工具包的比较信息。

特别是,请查看特性比较矩阵,其中包括EasyMock、jMock、Mockito、unitil Mock、PowerMock,当然还有JMockit。我尽量让它保持准确和最新。