我正在学习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方法的不同类。不知道该如何处理这个问题,但是将其包含在其他任何研究此问题的人中。
答案 0 :(得分:2)
您要查找的方法是isA
,而不是any
。
答案 1 :(得分:0)
这并不能解释我第一次强迫测试失败的尝试,但它确实解释了其他的混乱。来自Mockito文档:
public static T any(java.lang.Class clazz)
匹配任何对象,包括空值
此方法不使用给定参数进行类型检查,它是 只是为了避免在你的代码中强制转换。然而,这可能会改变 (可以添加类型检查)在未来的主要版本中。
因此,根据设计,它不会进行我希望的类型检查。我将不得不设计出另一种设计这些测试的方法。但这解释了为什么他们没有按照我的预期行事。