1. Overview

In this tutorial, we'll look at how we can return an argument that is passed to the mocked method. For this purpose, we'll use Mockito's built-in functionality.

2. Sample Application

Firstly, let's look at our sample application.

We have a PersonRepository class. Additionally, PersonService declares PersonRepository as a dependency:

public class PersonService {

    private final PersonRepository personRepository;

    public PersonService(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }
...
    public Person select(Person first, Person second, Person third) {
        return personRepository.select(first, second, third);
    }
}

public class PersonRepository {
...
    public Person select(Person first, Person second, Person third) {
        return first;
    }
}

3. Returning the First Argument

Mockito provides built-in support for getting method arguments. Hence we'll be using the AdditionalAnswers class which contains different implementations of the Answer interface.

Firstly, AdditionalAnswers.returnsFirstArg() helps us returning the first argument:

@InjectMocks
private PersonService personService;

@Mock
private PersonRepository personRepository;

@Test
public void shouldReturnFirstArg() {
    Person firstPerson = new Person("first");
    Person secondPerson = new Person("second");
    Person thirdPerson = new Person("third");
    Mockito.when(personRepository.select(firstPerson, secondPerson, thirdPerson)).then(AdditionalAnswers.returnsFirstArg());

    Person actual = personService.select(firstPerson, secondPerson, thirdPerson);

    Assertions.assertThat(actual).isEqualTo(firstPerson);
}

Here, since we're using AdditionalAnswers.returnsFirstArg(), the PersonRepository.select method returns firstPerson.

4. Returning the Second Argument

Similarly, AdditionalAnswers.returnsSecondArg() helps us returning the second argument:

@InjectMocks
private PersonService personService;

@Mock
private PersonRepository personRepository;

@Test
public void shouldReturnSecondArg() {
    Person firstPerson = new Person("first");
    Person secondPerson = new Person("second");
    Person thirdPerson = new Person("third");
    Mockito.when(personRepository.select(firstPerson, secondPerson, thirdPerson)).then(AdditionalAnswers.returnsSecondArg());

    Person actual = personService.select(firstPerson, secondPerson, thirdPerson);

    Assertions.assertThat(actual).isEqualTo(secondPerson);
}

Since we're using AdditionalAnswers.returnsSecondArg(), the return value will be secondPerson.

5. Returning the Last Argument

Next, AdditionalAnswers.returnsLastArg() helps us returning the last argument:

@InjectMocks
private PersonService personService;

@Mock
private PersonRepository personRepository;

@Test
public void shouldReturnLastArg() {
    Person firstPerson = new Person("first");
    Person secondPerson = new Person("second");
    Person thirdPerson = new Person("third");
    Mockito.when(personRepository.select(firstPerson, secondPerson, thirdPerson)).then(AdditionalAnswers.returnsLastArg());

    Person actual = personService.select(firstPerson, secondPerson, thirdPerson);

    Assertions.assertThat(actual).isEqualTo(thirdPerson);
}

Here, we're using AdditionalAnswers.returnsLastArg(). As a result, the return value will be thirdPerson.

6. Returning the Argument at Position

Finally, AdditionalAnswers.returnsArgAt(index) helps us returning the argument at the given index:

@InjectMocks
private PersonService personService;

@Mock
private PersonRepository personRepository;

@Test
public void shouldReturnArgAt() {
    Person firstPerson = new Person("first");
    Person secondPerson = new Person("second");
    Person thirdPerson = new Person("third");
    Mockito.when(personRepository.select(firstPerson, secondPerson, thirdPerson)).then(AdditionalAnswers.returnsArgAt(1));

    Person actual = personService.select(firstPerson, secondPerson, thirdPerson);

    Assertions.assertThat(actual).isEqualTo(secondPerson);
}

Here, since we're calling AdditionalAnswers.returnsArgAt() with the value of 1, the return value will be secondPerson. Remember that the argument index starts at 0.

7. Summary

In this tutorial, we've investigated how we can return the original arguments on mocked methods.

Check out the source code for all example over on Github.