Типичная проблема при тестировании кода с использованием библиотеки 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()
, будет возвращаться следующий пользователь из массива. Когда все пользователи будут возвращены, цикл начнется сначала.
Используя эти подходы, можно эффективно тестировать код, в котором один и тот же метод вызывается несколько раз с одними и теми же аргументами, но при этом должен возвращать разные результаты.
Добавить комментарий