/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockito.internal.verification.checkers; import java.util.List; import org.mockito.exceptions.Reporter; import org.mockito.internal.invocation.InvocationMatcher; import org.mockito.internal.invocation.InvocationsFinder; import org.mockito.internal.reporting.SmartPrinter; import org.mockito.internal.verification.api.InOrderContext; import org.mockito.internal.verification.argumentmatching.ArgumentMatchingTool; import org.mockito.invocation.Invocation; import org.mockito.verification.VerificationMode; public class MissingInvocationInOrderChecker { private final Reporter reporter; private final InvocationsFinder finder; public MissingInvocationInOrderChecker() { this(new InvocationsFinder(), new Reporter()); } MissingInvocationInOrderChecker(InvocationsFinder finder, Reporter reporter) { this.finder = finder; this.reporter = reporter; } public void check(List invocations, InvocationMatcher wanted, VerificationMode mode, InOrderContext context) { List chunk = finder.findAllMatchingUnverifiedChunks(invocations, wanted, context); if (!chunk.isEmpty()) { return; } Invocation previousInOrder = finder.findPreviousVerifiedInOrder(invocations, context); if (previousInOrder == null) { /** * It is of course possible to have an issue where the arguments are different * rather that not invoked in order. Issue related to * http://code.google.com/p/mockito/issues/detail?id=27. If the previous order * is missing, then this method checks if the arguments are different or if the order * is not invoked. */ List actualInvocations = finder.findInvocations(invocations, wanted); if (actualInvocations == null || actualInvocations.isEmpty()) { Invocation similar = finder.findSimilarInvocation(invocations, wanted); if (similar != null) { Integer[] indicesOfSimilarMatchingArguments = new ArgumentMatchingTool().getSuspiciouslyNotMatchingArgsIndexes(wanted.getMatchers(), similar.getArguments()); SmartPrinter smartPrinter = new SmartPrinter(wanted, similar, indicesOfSimilarMatchingArguments); reporter.argumentsAreDifferent(smartPrinter.getWanted(), smartPrinter.getActual(), similar.getLocation()); } else { reporter.wantedButNotInvoked(wanted); } } } else { reporter.wantedButNotInvokedInOrder(wanted, previousInOrder); } } }