我正在尝试将我的一些单元测试从使用 JMock 转换为使用 Mockito,但遇到了一些障碍。
首先在我的测试中,当使用 JMock 时, stub 的验证和返回发生在一个步骤中,如下所示
contextMockery.checking(new Expectations() {{
oneOf(dateUtilityService).isBeforeToday(URGENT_DATE);
will(returnValue(true));
}});
这实质上验证了该方法正在被调用并同时返回固定值。如果未调用 isBeforeToday 方法并同时返回我的固定值 true,则测试失败。而在使用 Mockito 时,我必须验证是否正在调用该方法,然后在单独的步骤中返回我的固定值,这些步骤几乎是重复的,如下所示:
doReturn(true).when(dateUtilityService).isBeforeToday(URGENT_DATE);
verify(dateUtilityService).isBeforeToday(URGENT_DATE);
没有办法一步完成吗?
其次,如果我忘记按照我的预期列出对我的模拟之一的方法调用,JMock 会因“意外调用异常”而无法通过测试,我认为这是正确的,而 Mockito 会很高兴地通过测试,除非我明确验证对模拟的方法调用绝不能发生,这是正确的(似乎是错误的)吗?如果对我模拟的依赖项进行了意外的方法调用,有没有办法告诉 mockito 测试失败?
最佳答案
1.
当您 stub 方法调用时,通常不需要验证方法 - 您应该根据返回值检查操作(在您的情况下,可能会发生某些事情,或者当 dateUtilityService 返回 true 时会返回某些东西 - 检查而不是验证与模拟互动。
Mockito 文档也讨论了这一点。 http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#2
2.
这实际上会导致脆弱的测试,并且不推荐使用 mockito 做事的方式。这就是为什么无法设置此行为的原因。
参见 http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#8
关于java - Mockito 与 JMock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24387558/