Как издеваться над этим внутренним объектом - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть такой код

String str = message.getMBC()
            .values()
            .stream()
            .findFirst()
            .get()
            .getId();

, где getMBC () возвращает LinkedHashMap с ключом String, а значением является некоторый ObjectA.

Я пишу контрольный пример, в котором используется strв некоторой логике.Я просто хочу смоделировать это сообщение, чтобы оно возвращало мне строковое значение без учета всех внутренних сложностей связанного хэш-карты и т. Д.

Я пробовал это в моем тестовом примере, где сообщение является фиктивным объектом.

when (message.getMBC()).get(anyObject()).getId()).thenReturn("STRING");

Я знаю, что делаю неправильно, поскольку getMBC () тоже должен быть ложным.

Какой самый простой способ издеваться над этим объектом?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Неправильный подход.Вы не издеваетесь над картами.Конец истории.

Значение: любая коллекция - это просто коллекция объектов.Всякий раз, когда вы думаете о насмешке над контейнером , вы, скорее всего, делаете что-то не так.Вы действительно используете его только тогда, когда нет лучшего способа проверить свои вещи.

Помимо этого: вы должны действительно понимать, что делают ваши тесты.Поэтому вместо when(x.get(any())).thenReturn(y) вы должны предпочесть просто иметь отдельную карту, которая содержит в точности те значения, которые необходимы для вашего теста.any() говорит: «Я не знаю, какие параметры будут использоваться».Но вы, вероятно, должны это знать.

Итак, короче говоря: (если вообще), вы должны только высмеивать объект message, чтобы возвращать настроенный экземпляр карты при вызовах getMBC().Ваш подход добавляет в ваши тесты "насмешливую сложность".Это приводит к тесной связи вашего теста с деталями реализации.Без веских причин.

0 голосов
/ 28 ноября 2018

Как и в приведенном ниже коде, вы можете шаг за шагом высмеивать внутренние объекты.

Message mockMessage = mock(Messsage.class);
when(mockMessage.getMBC()).thenReturn("AnyObject");
AnyObject mockAnyObject = mock(AnyObject.class);
when(mockAnyObject.getId()).thenReturn("STRING");

Попробуйте описанным выше способом смоделировать все объекты

...