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所)

匹配任何对象,包括空值

该方法不执行类型检查用给定的参数,它只有 ,以避免在代码中投射。然而,这可能会在未来的主要版本中更改 (可能会添加类型检查)。

所以通过设计它不会做我希望的类型检查。我将不得不找出另一种方法来设计这些测试。但这解释了他们为什么不像我预期的那样行事。