Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
25 Май 2023
2 мин
247

Многократный вызов одного и того же метода с использованием Mockito

Типичная проблема при тестировании кода с использованием библиотеки Mockito заключается в необходимости имитировать поведение метода, который при каждом

Типичная проблема при тестировании кода с использованием библиотеки Mockito заключается в необходимости имитировать поведение метода, который при каждом вызове должен возвращать разные результаты. Например, представьте себе ситуацию, когда есть метод, который возвращает данные пользователя. В тесте этот метод может быть вызван несколько раз, и каждый раз он должен возвращать разные данные.

public class UserService {
    public User getUser() {
        // Возвращает данные пользователя
    }
}

Тестирование такого метода с использованием Mockito может представлять сложность, поскольку по умолчанию Mockito возвращает одно и то же значение при каждом вызове имитированного метода.

UserService userService = mock(UserService.class);
when(userService.getUser()).thenReturn(new User("John", 25));

Тем не менее, Mockito предоставляет функциональность для имитации поведения метода, который при каждом вызове возвращает разные результаты.

Использование thenReturn()

when(userService.getUser()).thenReturn(new User("John", 25), new User("Jane", 30), new User("Alice", 35));

В этом примере, при первом вызове метода getUser(), будет возвращен пользователь «John», при втором вызове — «Jane», при третьем вызове — «Alice». Если метод будет вызван более трех раз, то он вернет значение последнего вызова, то есть «Alice».

Использование thenAnswer()

Еще один способ — использовать thenAnswer(). Он возвращает объект Answer, который может быть использован для динамического контроля поведения имитированного метода.

when(userService.getUser()).thenAnswer(
    new Answer() {
        private int count = 0;
        private User[] users = {new User("John", 25), new User("Jane", 30), new User("Alice", 35)};

        public User answer(InvocationOnMock invocation) {
            if (count >= users.length) {
                count = 0;
            }
            return users[count++];
        }
    }
);

В этом примере, каждый раз при вызове метода getUser(), будет возвращаться следующий пользователь из массива. Когда все пользователи будут возвращены, цикл начнется сначала.

Используя эти подходы, можно эффективно тестировать код, в котором один и тот же метод вызывается несколько раз с одними и теми же аргументами, но при этом должен возвращать разные результаты.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий