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



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