Mockito验证方法没有给出一致的结果
问题描述:
我正在学习GwtMockito,但无法在我的一个测试中获得一致的verify()方法。Mockito验证方法没有给出一致的结果
我想测试正确的GwtEvents正在被我的应用程序解雇。所以,我嘲笑事件总线像这样在我的@Before方法:
eventBus = mock(HandlerManager.class);
该测试通过预期:
// Passes as expected
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class));
我想迫使测试只是不知道它是运行正确。所以我改变了它,它仍然通过:
// Expected this to fail, but it passes
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class));
verifyZeroInteractions(eventBus).fireEvent(any(ErrorOccurredEvent.class));
这似乎与我矛盾。所以我删除了第一个测试:
// Fails as expected
verifyZeroInteractions(eventBus).fireEvent(any(ErrorOccurredEvent.class));
最后,我添加了一个不相关的事件应该导致失败
// Expected to fail, but passes
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class));
verify(eventBus).fireEvent(any(ModelCreatedEvent.class)); // This event is not used at all by the class that I'm testing. It's not possible for it to be fired.
我没有找到,说明发生了什么事情的任何文件。 ErrorOccurredEvent和ModelCreatedEvent都扩展了GwtEvent,并且已经在手动测试中验证过。我是否错误地测试了我的EventBus?如果是这样,那么有什么更好的办法呢?
更新
我已经做了一些额外的实验。这似乎是我与Mockito匹配的问题。当我的测试失败时,异常报告的方法签名为eventBus.fireEvent(<any>)
,所以它似乎没有考虑到我传入任何方法的不同类。不知道该怎么做,但包括它在这里为其他人研究这个问题。
答
您正在查找的方法是isA
,而不是any
。
答
这并不能解释我第一次强迫测试失败的尝试,但它确实解释了其他混淆。从文档的Mockito:
公共静态Ť任何(java.lang.Class中clazz所)
匹配任何对象,包括空值
该方法不执行类型检查用给定的参数,它只有 ,以避免在代码中投射。然而,这可能会在未来的主要版本中更改 (可能会添加类型检查)。
所以通过设计它不会做我希望的类型检查。我将不得不找出另一种方法来设计这些测试。但这解释了他们为什么不像我预期的那样行事。