这是我的JMock测试:
@Test
public void testRunModuleOK() {
App instance = getInstanceApp(window,logger);
Mockery context = new JUnit4Mockery();
final Modulable m = context.mock(Modulable.class);
context.checking(new Expectations() {{
oneOf(m).init(logger);
oneOf(m).start();
}});
instance.runModule(m);
}
那就是runModule:
void runModule(Modulable module) {
if(module == null)
throw new NullPointerException("Module is null");
module.init(mainLogger);
runningModules.add(module);
module.start();
}
我希望我的测试确保始终调用init()和start()一次。 不幸的是,当我在runModule中注释掉module.init和module.start时,测试仍然通过。我使用println来确保调用代码和测试。 奇怪的是,当我两次调用init(或启动)时,我会按预期失败。此外,当我从期望中评论出'oneOf ...'时,我也会失败。 如果在runModule中没有调用module.init和/或module.start,为什么测试通过? 感谢。
答案 0 :(得分:0)
您错过了验证步骤,该步骤告诉JMock您的测试已完成,并且应该关闭所有未完成的检查。在模拟上下文中调用assertIsSatisfied()
。
或者,从使用Mockery context = new JUnit4Mockery();
切换到使用@Rule public JUnitRuleMockery context = new JUnitRuleMockery();
。这将为你删除一些样板。