Как добавить макет коллекции с помощью аннотации с помощью Mockito - PullRequest
0 голосов
/ 11 февраля 2020

Я создал один параметризованный класс, который принимает два параметра. Один - это тип строки, а другой - тип класса List of Abstract. Конструктор класса выглядит следующим образом:

public TestService(Tenant tenant, List<AbstractService> testServices) {
        testServicesMap = testServices.stream().collect(Collectors.toMap(AbstractService::getType, Function.identity()));
}

Теперь я хочу написать тестовый пример Junit для этого класса, и для этого у меня есть следующий фрагмент кода.

    @Mock
    protected Tenant tenant;

    @Mock
    private List<AbstractService> testServices;

    @InjectMocks
    private TestService testService;

    @Before
    public void setup() {
        testServices.add(new JobService(new JobEventService()));
        testServices.add(new ApplicationService(new ApplicationEventService()));
        testServices.add(new UserService(new UserEventService()));
//      notificationService = new NotificationService(tenant, notificationServices);
//      MockitoAnnotations.initMocks(notificationService);
    }

Я также попытался включить две закомментированные строки, но теперь это работает. Следующая ошибка, которую система выдает при запуске.

org.mockito.exceptions.base.MockitoException: 
Cannot instantiate @InjectMocks field named 'notificationService' of type 'class com.test.TestService'.
You haven't provided the instance at field declaration so I tried to construct the instance.   
However the constructor or the initialization block threw an exception : `null`.    

Может ли кто-нибудь помочь в этом?

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

вы смешиваете макеты с реальными объектами, потому что вы создаете макет списка, но затем вызываете метод add в этом списке, и тогда вы ожидаете, что stream() будет работать как обычно.

Mockito mocks по умолчанию ничего не делает, поэтому вы должны сказать это:

Mockito.when(testServices.stream())
       .thenReturn(Stream.of(new JobService(new JobEventService())));

или лучше в вашем случае удалить @Mock из testServices и присвоить ему новый ArrayList

0 голосов
/ 11 февраля 2020

Проблема в том, что вы пытаетесь смоделировать список, и вызывается list.stream (), который по умолчанию в макете возвращает ноль.

Распространенным решением из дублирующих вопросов является использование @Spy списка.

...