使用Mockito来validation方法后没有任何东西被调用

我正在使用Mockito编写一个unit testing在Java中,我想validation某个方法是最后一个对象上调用。

我正在testing的代码中做这样的事情:

row.setSomething(value); row.setSomethingElse(anotherValue); row.editABunchMoreStuff(); row.saveToDatabase(); 

在我的模拟中,我并不关心在行上编辑所有内容的顺序,但是保存它之后,我试图做更多的事情。 有没有一个好的方法来做到这一点?

请注意,我不是在寻找verifyNoMoreInteractions:它不能确认saveToDatabase是最后一个叫做的事情,而且如果我调用我没有明确validation的行上的任何东西,它也会失败。 我希望能够这样说:

 verify(row).setSomething(value); verify(row).setSomethingElse(anotherValue); verifyTheLastThingCalledOn(row).saveToDatabase(); 

如果有帮助,我从JMocktesting切换到Mockito:

 row.expects(once()).method("saveToDatabase").id("save"); row.expects(never()).method(ANYTHING).after("save"); 

我认为这需要更多的定制工作。

 verify(row, new LastCall()).saveToDatabase(); 

接着

 public class LastCall implements VerificationMode { public void verify(VerificationData data) { List<Invocation> invocations = data.getAllInvocations(); InvocationMatcher matcher = data.getWanted(); Invocation invocation = invocations.get(invocations.size() - 1); if (!matcher.matches(invocation)) throw new MockitoException("..."); } } 

以前的答案:

你是对的。 verifyNoMoreInteractions是你所需要的。

 verify(row).setSomething(value); verify(row).setSomethingElse(anotherValue); verify(row).editABunchMoreStuff(); verify(row).saveToDatabase(); verifyNoMoreInteractions(row); 

不是100%的话题,但我只是想find相反的validation,这是唯一相关的结果,它结束了我后Mockito.verifyZeroInteractions(模拟);

只要有人在这里结束寻找这个…

这个问题使我对JMockit中的validation API做了一些改进(在即将发布的版本0.983中有提供)。

我提出的解决scheme允许你写(在一个testing方法中):

 new VerificationsInOrder() {{ unverifiedInvocations(); row.saveToDababase(); }}; 

…如果你只想validation某个方法是否被其他方法调用。 要validation它发生所有其他调用之前 ,只需将调用移动到顶部。 这实际上适用于任何连续的调用序列。

如果除了上面的validation之外,还需要validation其他方法是否以任何顺序被调用,那么可以将另一个validation块添加到testing中(在另一个块之前或之后,这并不重要):

 new Verifications() {{ row.setSomething(value); row.setSomethingElse(anotherValue); }}; 

虽然由于使用匿名内部类有点长,但这种语法既简单又灵活; 请注意它是如何为testing添加结构的,并避免重复方法调用(如verify(...) )。 比我在这里描述的更多(Hamcrest匹配器,调用次数等),它不限于实例方法的validation(静态方法和构造函数可以用同样的方式进行模拟和validation)。