我使用的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匹配器,调用计数等),并且它不限于实例方法的验证(静态方法和构造可以被嘲笑并以相同的方式验证)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top