1. Обзор
В этом уроке мы познакомимся с классом Mockito AdditionalAnswers и его методами.
2. Возврат Аргументов
Основная цель класса Дополнительные ответы состоит в том, чтобы возвращать параметры, переданные издевательскому методу.
Например, при обновлении объекта метод, над которым издеваются, обычно просто возвращает обновленный объект. Используя методы из Дополнительных ответов , мы можем вместо этого вернуть конкретный параметр, переданный в качестве аргумента методу, на основе его позиции в списке параметров .
Кроме того, Дополнительные ответы имеют различные реализации класса Answer .
Чтобы начать нашу демонстрацию, давайте создадим проект библиотеки.
Во-первых, мы создадим одну простую модель:
public class Book { private Long bookId; private String title; private String author; private int numberOfPages; // constructors, getters and setters }
Кроме того, нам нужен класс репозитория для поиска книг:
public class BookRepository { public Book getByBookId(Long bookId) { return new Book(bookId, "To Kill a Mocking Bird", "Harper Lee", 256); } public Book save(Book book) { return new Book(book.getBookId(), book.getTitle(), book.getAuthor(), book.getNumberOfPages()); } public Book selectRandomBook(Book bookOne, Book bookTwo, Book bookThree) { Listselection = new ArrayList<>(); selection.add(bookOne); selection.add(bookTwo); selection.add(bookThree); Random random = new Random(); return selection.get(random.nextInt(selection.size())); } }
Соответственно, у нас есть класс обслуживания, который вызывает наши методы репозитория:
public class BookService { private final BookRepository bookRepository; public BookService(BookRepository bookRepository) { this.bookRepository = bookRepository; } public Book getByBookId(Long id) { return bookRepository.getByBookId(id); } public Book save(Book book) { return bookRepository.save(book); } public Book selectRandomBook(Book book1, Book book2, Book book3) { return bookRepository.selectRandomBook(book1, book2, book3); } }
Имея это в виду, давайте создадим несколько тестов.
2.1. Возврат первого аргумента
Для нашего тестового класса нам нужно включить использование аннотаций с тестами Mockito, аннотируя тестовый класс JUnit для запуска с MockitoJUnitRunner . Кроме того, нам нужно будет издеваться над нашим классом службы и репозитория :
@RunWith(MockitoJUnitRunner.class) public class BookServiceUnitTest { @InjectMocks private BookService bookService; @Mock private BookRepository bookRepository; // test methods }
Во – первых, давайте создадим тест, возвращающий первый аргумент – AdditionalAnswers.returnsFirstArg() :
@Test public void givenSaveMethodMocked_whenSaveInvoked_ThenReturnFirstArgument_UnitTest() { Book book = new Book("To Kill a Mocking Bird", "Harper Lee", 256); Mockito.when(bookRepository.save(any(Book.class))).then(AdditionalAnswers.returnsFirstArg()); Book savedBook = bookService.save(book); assertEquals(savedBook, book); }
Другими словами, мы будем издеваться над методом save из нашего класса BookRepository , который принимает объект Book .
Когда мы запустим этот тест, он действительно вернет первый аргумент , который равен объекту Book , который мы сохранили.
2.2. Возврат второго аргумента
Во-вторых, мы создаем тест, используя Дополнительные ответы.возвращает Второй Arg() :
@Test public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnSecondArgument_UnitTest() { Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsSecondArg()); Book secondBook = bookService.selectRandomBook(book1, book2, book3); assertEquals(secondBook, book2); }
В этом случае при выполнении метода select Random Book метод вернет вторую книгу.
2.3. Возврат последнего аргумента
Аналогично, мы можем использовать Дополнительные ответы.возвращает последний аргумент Arg () , чтобы получить последний аргумент, который мы передали нашему методу:
@Test public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnLastArgument_UnitTest() { Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsLastArg()); Book lastBook = bookService.selectRandomBook(book1, book2, book3); assertEquals(lastBook, book3); }
Здесь вызванный метод вернет третью книгу, так как это последний параметр.
2.4. Возврат аргумента в индексе
Наконец, давайте напишем тест, используя метод, который позволяет нам возвращать аргумент по заданному индексу – AdditionalAnswers.returnsArgAt(int index) :
@Test public void givenCheckifEqualsMethodMocked_whenCheckifEqualsInvoked_ThenReturnArgumentAtIndex_UnitTest() { Book book1 = new Book(1L, "The Stranger", "Albert Camus", 456); Book book2 = new Book(2L, "Animal Farm", "George Orwell", 300); Book book3 = new Book(3L, "Romeo and Juliet", "William Shakespeare", 200); Mockito.when(bookRepository.selectRandomBook(any(Book.class), any(Book.class), any(Book.class))).then(AdditionalAnswers.returnsArgAt(1)); Book bookOnIndex = bookService.selectRandomBook(book1, book2, book3); assertEquals(bookOnIndex, book2); }
В конце концов, поскольку мы запросили аргумент из индекса 1, мы получим второй аргумент — в частности, book2 в этом случае.
3. Заключение
В целом, в этом уроке были рассмотрены методы класса Mockito AdditionalAnswers .
Реализация этих примеров и фрагментов кода доступна на GitHub .