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

标签 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");

最佳答案

我认为这需要更多的定制工作。

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);

关于java - 使用 Mockito 验证方法后没有调用任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512254/

相关文章:

java - 为什么这个同步语句示例不起作用?

javascript - 如何为 Express.js 应用程序建立有效的单元测试和场景测试框架?

unit-testing - BizUnit 与 Visual Studio 团队测试

angular 2 - 具有 injectionToken 依赖性的模拟组件

C# NUnit 测试 : Mock a external DLL-Method who call a Socket connection to a extern Device

c# - 模拟 Entity Framework 数据库

java - 当您将 .method 放在对象后面时会发生什么?

java - 使用 bufferReader 将文本拆分为单词

java - Apache FOP 和 Arial 字体

python - 如何在 Python 中的单个测试期间替换类变量?