Должен ли я издеваться над списком для потоковых операций? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть строка кода в функции, которая применяет потоковые операции к ArrayList как:

List<Entity> list = xyz(); 

long result = list.stream().map(n -> n.getData()).filter(n -> n == 1).count();

Теперь, когда я пишу тест для этого метода, я должен сделать так:

@Mock
private List<Entity> list;

//inside the test method
when(list.stream().map(any()).filter(any()).count()).thenReturn(someValue);

Что мне приходит в голову, так это то, что когда мы вызываем потоковые операции в нашем коде, мы в основном выходим из нашего класса для вызова этих функций. Поскольку это модульное тестирование, мы должны оставаться внутри нашего модуля. Пожалуйста, уточните, если у меня есть некоторые заблуждения. Если нам не надо издеваться над List, то зачем?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Похоже, вы на самом деле не заботитесь о внутренней работе потоковых операций, вы просто заботитесь о ее результатах.

По моему мнению, вы должны извлечь эту логику в какой-то другой специализированный класс, у которого есть открытый метод, принимающий список и возвращающий счетчик.

Тогда вы можете использовать этот класс в качестве зависимости и смоделировать его метод подсчета:

// the impl

private DataCounter dataCounter;

...

List<Entity> list = xyz(); 

long result = dataCounter.count(list);

// test class

@Mock
private DataCounter dataCounter;

//inside the test method
when(dataCounter.count(Mockito.any(List.class)).thenReturn(Mockito.eq(someValue));
0 голосов
/ 29 октября 2018

Вы могли бы издеваться над списком, но это, вероятно, намного больше проблем, чем оно того стоит. Интерфейсы списков и потоков настолько велики, что сложно их высмеивать, не насмехаясь над каждым методом (нет, спасибо) или насмехаясь только над методами, которые вы используете, а это значит, что вы будете полагаться на знание внутренних деталей реализации метода, который вы ' повторное тестирование. Последнее приводит к хрупким испытаниям. Лучше всего написать тест, который не заботится о деталях реализации, только о входах и выходах.

Пересмешку следует использовать, когда непозволительно сложно создать правильную версию объекта или когда вы хотите обеспечить изоляцию для теста. Списки создавать несложно, и они настолько хорошо протестированы, что их насмешка на самом деле не дает никакой пользы для повышенной изоляции.

Просто создайте список как обычно.

list = Arrays.asList(new Entity(1), new Entity(2), new Entity(1));

В этом случае вы бы заявили, что результат метода равен 2.

Вы можете получить некоторое преимущество от насмешек над сущностью, однако, например,

Mockito.when(Entity.getData()).thenReturn(1);
...