Насколько я понимаю, когда вы создаете список valueProcessors
, используя @Injectable
, вы создаете макет списка.
Это означает, что методы из указанного списка будут посмеиватьсятак что они будут возвращать «пустые» значения по умолчанию (если через блоки Expectation
ничего не указано).
Таким образом, в первом непотоковом коде, так как в списке не вызывается никаких методов, нет проблем
Но во втором коде, использующем поток, вызов valueProcessors.stream()
выполняет «пустое» смоделированное поведение, которое возвращает пустой поток, и поэтому все остальное тоже становится пустым.
Решение, с которым я столкнулся, заключается в создании тестируемого экземпляра, передавая ему «реальный» список вместо поддельного:
@RunWith(JMockit.class)
public class StackOverflowTest {
// empty injectable just so that the processor can be created
@Injectable
private List<ValueProcessor> valueProcessors;
// availableDuringSetup = true to be able to modify the processor
@Tested(availableDuringSetup = true)
private Processor processor;
@Before
public void setUp() throws Exception {
// create new instance of the processor (now the valueProcessors list is a real list)
processor = new Processor(Collections.singletonList(processor -> Collections.singletonList(new Response())));
}
@Test
public void testProc() {
assertThat(processor.proc(null), hasSize(1));
}
}