Mockito: как динамически установить thenReturn()?

У меня есть метод, который принимает список элементов. Я бы хотел, чтобы метод mocked возвращал соответствующий список того же размера (т.е. List<Results>)

В более общем смысле можно ли динамически устанавливать возвращаемое значение в зависимости от заданного ввода?

Проблема в том, что у меня есть несколько тестов для одного и того же метода. Тест A предназначен для пустого списка, а тест B — для списка с несколькими объектами. Тем не менее, у меня есть только один @Before метод.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
917
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этого вы можете использовать thenAnswer, возможно, в сочетании с Аргументкаптор.

Но реальный ответ таков: подумайте о том, чтобы не делать этого.

Модульные тесты должны быть прямолинейными. Когда что-то выходит из строя, вы быстро смотрите на модульный тест, и вы уже знаете, где искать в производственном коде, чтобы определить основную причину. Все, что усложняет ваши тесты мощь, усложняет их.

Другими словами: вместо того, чтобы придумывать сложный код тестовое задание, который дает динамические результаты... лучше напишите несколько простых тестов. Вы контролируете то, что входит в ваш тест. Итак, если вам нужны тесты, которые получают 2, 3, 5 аргументов, и вам нужно возвращать 2, 3, 5 элементов для каждого случая: тогда напишите 3 разных теста.

Я вижу, может быть, я слишком усложнил это. Я понимаю, что я должен определить ad-hoc when-thenReturn для каждого теста. Спасибо!

yaseco 07.04.2019 16:53

@yaseco Пожалуйста, я рад, что этот «неответ» оказался полезным!

GhostCat 07.04.2019 17:57

Ну, правильный способ сделать это:

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-

Другие вопросы по теме