使用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)。