Mockito验证方法没有给出一致的结果



我正在学习GwtLockito,但在一次测试中遇到了获取一致性verify()方法结果的问题。

我正在尝试测试我的应用程序是否触发了正确的GwtEvent。所以我在@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.

我找不到任何解释发生了什么的文档。ErrorOccuredEvent和ModelCreatedEvent都扩展了GwtEvent,并且已经在手动测试中进行了验证。我是否错误地测试了EventBus?如果是这样的话,还有什么更好的方法呢?

更新

我做了一些额外的实验。这似乎是我对Mockito火柴机的一个问题。当测试失败时,异常将方法签名报告为eventBus.fireEvent(<any>),因此它似乎没有考虑我传递给any方法的不同类。还不知道该怎么办,但在这里为其他研究这个问题的人提供它。

您要查找的方法是isA,而不是any

这并不能解释我第一次尝试强制测试失败的原因,但它确实解释了其他的困惑。来自Mockito文档:

公共静态任意(java.lang.Class-clazz)

匹配任何对象,包括空

此方法不使用给定参数进行类型检查,而是只是为了避免代码中的强制转换。然而,这种情况可能会改变(可以添加类型检查)。

因此,在设计上,它并没有进行我所希望的类型检查。我必须想出另一种方法来设计这些测试。但这就解释了他们为什么没有像我预期的那样行事。

最新更新