Mockito: Как установить thenReturn () динамически? - PullRequest
1 голос
/ 07 апреля 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

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

import org.mockito.AdditionalAnswers; String [] logEntry = // Некоторый код инициализации List logEntryList = Arrays.asList (logEntry); когда (tuple.getString (1)) thenAnswer (AdditionalAnswers.returnsElementsOf (logEntryList));.

При каждом вызове возвращаются последовательные элементы массива logEntry. Таким образом, i-й вызов tuple.getString (1) возвращает i-й элемент массива logEntry.

P.S: пример в документации по returnElementsOf (на момент написания этой статьи) не обновлялся (он все еще использует пример ReturnsElementsOf): http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/AdditionalAnswers.html#returnsElementsOf(java.util.Collection)it

1 голос
/ 07 апреля 2019

Вы можете использовать thenAnswer, вероятно, в сочетании с ArgumentCaptor для достижения этого.

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

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

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

...