我们终于从迁移的JUnit 3我们的单元测试代码库中的JUnit 4支持基类的我们也大量使用JMock的2缺乏在Junit4/Jmock2
的在JUnit 3,JMock的提供了一个有用的测试基类(MockObjectTestCase),它本身也是Junit TestCase的子类,它处理有关模拟框架的各种内务职责。它让测试课变得非常容易。
现在使用JUnit4,JMock不提供这种支持。你的测试类必须手动创建一个Mockery对象,它必须记住使用正确的测试运行器注释,并且必须将所有与模拟相关的操作委托给嘲笑。简而言之,它对测试类的责任远远超过JUnit 3测试所需的责任。
现在我明白JUnit4的一部分魅力在于不需要继承某些东西,但是这种JMock情况看起来像是倒退了一步,并且使得从3移植到4应该比应该需要更多的工作。
我错过了什么吗?实际上是否有一种很好的方式来编写我的JUnit4/Jmock2测试类,而无需手动将所有管道添加到每个类?当然,我可以编写自己的支持基类,但似乎JMock2 API中有一个明显的漏洞,我不得不怀疑我是否错过了这一点。
编辑:这里有一个可选的支持类会是什么样子的源代码:
@RunWith(JMock.class)
public class JMockSupport {
protected final Mockery mockery = new Mockery();
protected void checking(ExpectationBuilder expectations) {
mockery.checking(expectations);
}
protected <T> T mock(Class<T> typeToMock) {
return mockery.mock(typeToMock);
}
protected <T> T mock(Class<T> typeToMock, String name) {
return mockery.mock(typeToMock, name);
}
protected Sequence sequence(String name) {
return mockery.sequence(name);
}
protected void setDefaultResultForType(Class<?> type, Object result) {
mockery.setDefaultResultForType(type, result);
}
protected void setImposteriser(Imposteriser imposteriser) {
mockery.setImposteriser(imposteriser);
}
protected void setNamingScheme(MockObjectNamingScheme namingScheme) {
mockery.setNamingScheme(namingScheme);
}
protected States states(String name) {
return mockery.states(name);
}
}
这包含了所有的JUnit3 MockObjectTestCase类中定义的方法,这只是呼应的嘲弄。 @RunWith注解也在那里,以避免忘记将其添加到测试类中的可能性。
我同意构图的灵活性非常高,但是继承带来了方便。能够挑选是很好的。 – skaffman 2009-09-05 21:06:18