用Java创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?
当前回答
对于一些不同的东西,您可以使用JtestR中组合的JRuby和Mocha,以表达性和简洁的Ruby为您的Java代码编写测试。这里有一些有用的JtestR模拟示例。这种方法的一个优点是模拟具体类非常简单。
其他回答
是的,Mockito是一个很棒的框架。我使用它与hamcrest和谷歌guice一起设置我的测试。
Mockito还提供了存根方法、匹配参数(如anyInt()和anyString())、验证调用次数(times(3)、atLeastOnce()、never())等选项。
我还发现Mockito简单干净。
我不喜欢Mockito的一点是你不能存根静态方法。
我开始通过JMock使用mock,但最终过渡到使用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实现。
我很早就使用了JMock。我在我的最后一个项目中尝试了Mockito,并喜欢它。更简洁,更干净。PowerMock涵盖了Mockito中没有的所有需求,比如模拟静态代码、模拟实例创建、模拟最终类和方法。这样我就有了完成工作所需的一切。
推荐文章
- 为什么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真的只是调试?