Question

I'm trying to write a unit test that checks if methods were invoked in an order. To do that I'm using Mockito's inOrder.verify() like this:

@Test
public void shouldExecuteAllFileCommandsOnAFileInFIFOOrder() {
    // Given
    ProcessFileListCommand command = new ProcessFileListCommand();

    FileCommand fileCommand1 = mock(FileCommand.class, "fileCommand1");
    command.addCommand(fileCommand1);

    FileCommand fileCommand2 = mock(FileCommand.class, "fileCommand2");
    command.addCommand(fileCommand2);

    File file = mock(File.class, "file");
    File[] fileArray = new File[] { file };

    // When
    command.executeOn(fileArray);

    // Then
    InOrder inOrder = Mockito.inOrder(fileCommand1, fileCommand2);
    inOrder.verify(fileCommand1).executeOn(file);
    inOrder.verify(fileCommand2).executeOn(file);
}

However, the second verify() fails with the following error:

org.mockito.exceptions.verification.VerificationInOrderFailure: 
Verification in order failure
Wanted but not invoked:
fileCommand2.executeOn(file);
-> at (...)
Wanted anywhere AFTER following interaction:
fileCommand1.executeOn(file);
-> at (...)

If I change .executeOn(file) to .executeOn(any(File.class)) the test passes, but I want to make sure that the methods are invoked using the same argument.

Here's the class I'm testing:

public class ProcessFileListCommand implements FileListCommand {

    private List<FileCommand> commands = new ArrayList<FileCommand>();

    public void addCommand(final FileCommand command) {
        this.commands.add(command);
    }

    @Override
    public void executeOn(final File[] files) {
        for (File file : files) {
            for (FileCommand command : commands) {
                file = command.executeOn(file);
            }
        }
    }
}
Was it helpful?

Solution

The test fails because the argument to the second executeOn() method call is not the same file as the argument of the first one, since the first file is replaced by another one in

 file = command.executeOn(file);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top