使用Mockito验证方法后没有调用任何内容

时间:2009-02-04 17:00:10

标签: java unit-testing mocking mockito

我正在使用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");

3 个答案:

答案 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匹配器,调用计数等),并且它不仅限于实例方法的验证(静态方法和构造函数可以以相同的方式进行模拟和验证)。