我想使用 Mockito 来验证一些事情,但研究文档让我相信,如果不使用常用的 Mockito 工具,这是不可能的。以此为例:
DrawTool tool = mock(DrawTool.class);
new Drawer().draw(tool);
verify(tool).begin(); // Make sure begin and end are called exactly once each
verify(tool).end();
InOrder inOrder = inOrder(tool);
inOrder.verify(tool).begin();
inOrder.verify(tool).end();
inOrder.verify(tool).flush();
inOrder.verifyNoMoreInteractions();
这个测试很好地验证了几件事,例如验证那flush
是最后一次交互,但似乎 Mockito 无法验证那begin
是第一次交互。我对 Mockito 工具的不对称性感到惊讶,因此我正在研究创建自定义 VerificationModes 的可能性。我想创建一个类似的 VerificationModebeforeAnyOther
并像这样使用它:
inOrder.verify(tool, beforeAnyOther()).begin();
inOrder.verify(tool).end();
inOrder.verify(tool, beforeAnyOther()).flush();
inOrder.verifyNoMoreInteractions();
目的是验证begin
首先被调用,并且在和之间没有相关的交互end
,flush
而在和之间的交互begin
未end
指定。
我一直在研究现有 VerificationModes 的源代码,似乎原则上这应该是一个简单的 VerificationMode 来实现,但是一旦我超越了 Mockito 的一些主要类,文档就会变得非常薄,几乎就像它试图告诉我一样我不应该接触这些课程。我特别警惕那些开始的包,org.mockito.internal
因为像这样的名字向我暗示,即使它们是公共的,这些类也可能会发生变化。
实现 VerificationMode 的真正重要的类似乎都在org.mockito.internal.verification.api
包中。整个包似乎只有一点 javadoc,上面写着:“一旦验证 API 完全完成,这个包应该向公众开放。” 这是否意味着这个包正在被积极修改,所以我不应该使用它包含的任何东西,或者这只是它多年来所说的东西,而且这个包可能永远不会真正改变?
如果我不能使用其中的类,org.mockito.internal.verification.api
那么似乎不可能实现自定义 VerificationModes。有没有办法在没有自定义 VerificationModes 的情况下做这样的事情?