У меня есть метод, который принимает список элементов. Я бы хотел, чтобы метод mocked возвращал соответствующий список того же размера (т.е. List<Results>
)
В более общем смысле можно ли динамически устанавливать возвращаемое значение в зависимости от заданного ввода?
Проблема в том, что у меня есть несколько тестов для одного и того же метода. Тест A предназначен для пустого списка, а тест B — для списка с несколькими объектами. Тем не менее, у меня есть только один @Before
метод.
Для этого вы можете использовать thenAnswer
, возможно, в сочетании с Аргументкаптор.
Но реальный ответ таков: подумайте о том, чтобы не делать этого.
Модульные тесты должны быть прямолинейными. Когда что-то выходит из строя, вы быстро смотрите на модульный тест, и вы уже знаете, где искать в производственном коде, чтобы определить основную причину. Все, что усложняет ваши тесты мощь, усложняет их.
Другими словами: вместо того, чтобы придумывать сложный код тестовое задание, который дает динамические результаты... лучше напишите несколько простых тестов. Вы контролируете то, что входит в ваш тест. Итак, если вам нужны тесты, которые получают 2, 3, 5 аргументов, и вам нужно возвращать 2, 3, 5 элементов для каждого случая: тогда напишите 3 разных теста.
@yaseco Пожалуйста, я рад, что этот «неответ» оказался полезным!
Ну, правильный способ сделать это:
import org.mockito.AdditionalAnswers;
String[] logEntry = // Some initialization code
List<String> logEntryList = Arrays.asList(logEntry);
when(tuple.getString(1)).thenAnswer(AdditionalAnswers.returnsElementsOf(logEntryList));
При каждом вызове возвращаются последовательные элементы массива logEntry. Таким образом, вызов яth tuple.getString(1)
возвращает элемент яth массива logEntry.
P.S. Пример в документации returnsElementsOf
(на момент написания этой статьи) не обновлен (он по-прежнему использует пример ReturnsElementsOf
): http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/AdditionalAnswers.html#returnsElementsOf(java.util.Collection)it
Обновлено: Javadoc теперь обновлен: https://javadoc.io/static/org.mockito/mockito-core/3.1.0/org/mockito/AdditionalAnswers.html#returnsElementsOf-java.util.Collection-
Я вижу, может быть, я слишком усложнил это. Я понимаю, что я должен определить ad-hoc when-thenReturn для каждого теста. Спасибо!