我正在使用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");
答案 0 :(得分:56)
我认为这需要更多的定制工作。
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);
答案 1 :(得分:11)
关于主题不是100%,但我只是想找到与验证相反的结果,这是唯一的相关结果,最终我是在Mockito.verifyZeroInteractions(模拟)之后;
只是因为其他人在这里寻找这个......
答案 2 :(得分:0)
这个问题促使我对JMockit中的验证 API进行了一些增强(可在即将发布的0.983版本中找到)。
我提出的解决方案允许您编写(在测试方法中):
new VerificationsInOrder() {{
unverifiedInvocations();
row.saveToDababase();
}};
...如果您只想验证在其他所有方法之后调用某个方法。要验证在所有其他调用之前发生,只需将呼叫移至顶部即可。这实际上适用于任何连续调用序列。
如果除了上述验证之外,您还想验证是否以任何顺序调用了其他一些方法,可以在测试中添加第二个验证块(在其他块之前或之后) ,没关系):
new Verifications() {{
row.setSomething(value);
row.setSomethingElse(anotherValue);
}};
虽然由于使用了匿名内部类而有点长,但这种语法既简单又灵活;注意它如何为测试添加结构并避免重复方法调用(如verify(...)
)。它比我在这里描述的更多(Hamcrest匹配器,调用计数等),并且它不仅限于实例方法的验证(静态方法和构造函数可以以相同的方式进行模拟和验证)。