我们终于将我们的单元测试代码库从 JUnit 3 迁移到了 JUnit 4。我们还大量使用了 JMock 2。
在 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 注释也在那里,以避免忘记将其添加到测试类的可能性。