什么';Java的最佳模拟框架是什么?
在Java中创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?我在使用中取得了很好的成功 当我尝试学习JMock和EasyMock时,我发现学习曲线有点陡峭(尽管可能只是我自己) 我喜欢Mockito,因为它的语法简单明了,我能很快掌握。最小语法的设计是为了很好地支持常见的情况,尽管我需要做一些更复杂的事情的时候,我发现我想要的东西得到了支持并且很容易掌握 以下是Mockito主页上的一个(节略)示例:什么';Java的最佳模拟框架是什么?,java,unit-testing,mocking,Java,Unit Testing,Mocking,在Java中创建模拟对象的最佳框架是什么?为什么?每个框架的优点和缺点是什么?我在使用中取得了很好的成功 当我尝试学习JMock和EasyMock时,我发现学习曲线有点陡峭(尽管可能只是我自己) 我喜欢Mockito,因为它的语法简单明了,我能很快掌握。最小语法的设计是为了很好地支持常见的情况,尽管我需要做一些更复杂的事情的时候,我发现我想要的东西得到了支持并且很容易掌握 以下是Mockito主页上的一个(节略)示例: import static org.mockito.Mockito.*;
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
没有比这更简单的了
我能想到的唯一主要缺点是它不会模拟静态方法。我们在工作中大量使用和EasyMock类扩展,并且对此非常满意。它基本上能给你所需要的一切。看看文档,有一个很好的示例向您展示了EasyMock的所有功能。我开始通过JMock使用Mock,但最终过渡到使用EasyMock。EasyMock就是这么简单,提供了一种感觉更自然的语法。从那以后我就再也没有切换过。Mockito还提供了存根方法、匹配参数(如anyInt()和anyString())、验证调用次数(次数(3)、至少一次()和从不()等)的选项 我还发现莫基托是
我不喜欢Mockito的一点是你。是的,Mockito是一个很棒的框架。我将它与和一起使用来设置测试。您还可以看看使用Groovy进行测试。在Groovy中,您可以使用“as”操作符轻松模拟Java接口:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
除了这一基本功能之外,Groovy在模拟方面还提供了更多功能,包括强大的MockFor
和StubFor
类
我在这方面一直很成功 这是相当新的,所以它有点原始和记录不足。它使用动态地重新定义类字节码,因此可以模拟所有方法,包括静态、私有、构造函数和静态初始值设定项。例如:
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
它有一个允许录制/回放场景的预期界面:
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
缺点是它需要Java 5/6。我喜欢JMock,因为您可以设置期望值。这与检查在某些模拟库中是否找到调用方法完全不同。使用JMock,您可以编写非常复杂的期望值。查看jmock。我是PowerMock的创建者,因此显然我必须推荐!:-) 扩展EasyMock和Mockito,使其能够创建、最终甚至私有方法。EasyMock支持已经完成,但是Mockito插件还需要更多的工作。我们还计划添加JMock支持
PowerMock并不打算取代其他框架,而是可以在其他框架不允许模拟的复杂情况下使用。PowerMock还包含其他有用的功能,如和构造函数。模拟的最佳解决方案是让机器通过基于规范的自动化测试完成所有工作。对于Java,请参阅和库中包含的框架。使用自动化的基于规范的测试框架,您可以提供被测试方法的规范(关于它的属性应该为true),框架会自动生成测试和模拟对象 例如,以下属性测试Math.sqrt方法,以查看任意正数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实现。对于稍有不同的东西,您可以使用和,并将其组合在一起,以表达简洁的Ruby为Java代码编写测试。JtestR有一些有用的模拟示例。这种方法的一个优点是模拟具体类非常简单。包含了大量有关当前模拟工具包的比较信息
特别是,请查看,其中包括EasyMock、jMock、Mockito、Unitils Mock、PowerMock,当然还有JMockit。我尽量保持它的准确性和最新性。我很早就使用了JMock。我在上一个项目中尝试过Mockito,并且喜欢它。更简洁,更干净。PowerMock涵盖了Mockito中缺少的所有需求,例如模拟静态代码、模拟实例创建、模拟最终类和方法。因此,我已经具备了执行工作所需的一切。我开始使用mock with。很容易理解,但重播步骤有点烦人。删除了这一点,还具有更清晰的语法,因为可读性似乎是其主要目标之一。我再怎么强调这一点都不为过,因为大多数开发人员都会花时间阅读和维护现有代码,而不是创建代码 另一件好事是,接口和实现类以相同的方式处理,这与EasyMock不同,在EasyMock中,您仍然需要记住(并检查)以使用EasyMock类扩展 我最近快速浏览了一下,虽然功能的详细列表相当全面,但我认为其代价是结果代码的易读性,并且必须编写更多的代码 对我来说,Mockito非常适合,易于编写和阅读,并且能够处理大多数代码需要的大多数情况。使用将是我的选择 有一件事要考虑的是,你选择的工具,如果你自己开发,或在一个小紧密的团队,可能不是T。