使用到的Mockito验证没有什么方法之后调用
-
21-08-2019 - |
题
我使用的Mockito用Java编写一个单元测试,我想验证一定的方法是最后一个在对象上调用。
我在做这样的事情在代码测试:
row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();
在我的模拟,我不关心,我对行编辑的一切命令,但我的这是非常重要的是不要的尝试做任何事情更多了,我得救后它。有没有做到这一点的好办法?
请注意,我不是在寻找verifyNoMoreInteractions:它不确认saveToDatabase是所谓的最后一件事,如果我呼吁,我不明确验证该行任何它也会失败。我想可以这样说:
verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();
如果有帮助,我从没有这样的测试JMock的切换到的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%,但我只是希望找到验证的相反,这是唯一的相关的结果,它结束了我Mockito.verifyZeroInteractions后(模拟);
只是柜面任何人在这里结束了寻找这...
这个问题促使我做出一些增强功能的考证的API中 JMockit (在即将到来的版本0.983可用)。
我想出了该解决方案允许你写(在测试法):
new VerificationsInOrder() {{
unverifiedInvocations();
row.saveToDababase();
}};
...如果你只是想验证一个特定的方法是一切后调用。为了验证它发生的前的其他所有调用,只需将呼叫转移到顶部。这实际上适用于连续调用的任何序列。
如果在除了上述验证,则还希望验证一些其它方法被调用以任何顺序,第二验证块可以被添加到测试(之前或其他块之后,它并不重要):
new Verifications() {{
row.setSomething(value);
row.setSomethingElse(anotherValue);
}};
虽然有点使用匿名内部类的长,因为该语法是既简单又灵活;注意它是如何增加结构的测试,并且避免了方法调用(如verify(...)
)的重复。还有更多的比我在这里描述的(Hamcrest匹配器,调用计数等),并且它不限于实例方法的验证(静态方法和构造可以被嘲笑并以相同的方式验证)。