用Java创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?
当前回答
模拟的最佳解决方案是让机器通过自动化的基于规范的测试来完成所有工作。对于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实现。
其他回答
我已经成功使用Mockito。
当我尝试学习JMock和EasyMock时,我发现学习曲线有点陡峭(尽管可能只有我这样)。
我喜欢Mockito,因为它的语法简单干净,我可以很快掌握。最小语法的设计是为了很好地支持常见的情况,尽管有几次我需要做一些更复杂的事情,但我发现我想要的东西是支持的,而且很容易掌握。
以下是Mockito主页的一个例子:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
没有比这更简单的了。
我能想到的唯一主要缺点是它不会模拟静态方法。
我们在工作中大量使用EasyMock和EasyMock类扩展,并且对它非常满意。它基本上能满足你所有的需求。看一下文档,有一个非常好的例子,它向您展示了EasyMock的所有特性。
对于一些不同的东西,您可以使用JtestR中组合的JRuby和Mocha,以表达性和简洁的Ruby为您的Java代码编写测试。这里有一些有用的JtestR模拟示例。这种方法的一个优点是模拟具体类非常简单。
我是PowerMock的创建者,所以显然我必须推荐它!: -)
PowerMock扩展了EasyMock和Mockito,具有模拟静态方法、final方法甚至私有方法的能力。EasyMock支持已经完成,但是Mockito插件还需要一些工作。我们还计划添加JMock支持。
PowerMock并不打算取代其他框架,而是可以在其他框架不允许模拟的复杂情况下使用它。PowerMock还包含其他有用的特性,例如抑制静态初始化器和构造函数。
JMockit项目网站包含大量当前模拟工具包的比较信息。
特别是,请查看特性比较矩阵,其中包括EasyMock、jMock、Mockito、unitil Mock、PowerMock,当然还有JMockit。我尽量让它保持准确和最新。
推荐文章
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件
- 如何直接从测试驱动程序调用自定义的Django manage.py命令?
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- 如何重置笑话模拟函数调用计数之前,每次测试
- Java 8流和数组操作
- Java Regex捕获组
- Openssl不被视为内部或外部命令
- 如何添加自定义方法到Spring Data JPA
- 如何在Ubuntu中设置Java环境路径
- 无法执行dex:在Eclipse中超过GC开销限制