Mockito验证方法不能给出一致的结果

时间:2015-04-02 18:58:03

标签: unit-testing gwt mockito gwtmockito

我正在学习GwtMockito,但在我的一个测试中遇到一致的verify()方法会导致问题。

我正在尝试测试我的应用程序正在触发正确的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>),因此它似乎没有考虑我传递给any方法的不同类。不知道该如何处理这个问题,但是将其包含在其他任何研究此问题的人中。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

  

public static T any(java.lang.Class clazz)

     

匹配任何对象,包括空值

     

此方法不使用给定参数进行类型检查,它是   只是为了避免在你的代码中强制转换。然而,这可能会改变   (可以添加类型检查)在未来的主要版本中。

因此,根据设计,它不会进行我希望的类型检查。我将不得不设计出另一种设计这些测试的方法。但这解释了为什么他们没有按照我的预期行事。