Как мне издеваться над конструктором с помощью параметров, используя только Mockito - PullRequest
0 голосов
/ 15 октября 2019

Как мне смоделировать конструктор с параметрами с помощью MockitoJunitRunner

@Component
@Slf4j
public class InsurancePeriodCreator {

    //declare variables 

    public InsurancePeriodCreator(InsurancePeriod srcInsurancePeriod, PensionCase pensionCase, PensionHandlerParty pensionHandlerParty) {
        //some code 
    }

    public InsurancePeriod createNewIP() {
        // some code
    }
}

Я пытаюсь написать тесты для этого метода и пытаюсь смоделировать деталь в **

@Component
@Slf4j
@RequiredArgsConstructor
class InsurancePeriodQueryHelper {

    @Transactional
    private void createNewInsurancePeriods(PensionCase pensionCase, PensionHandlerParty pensionHandlerParty, List<InsurancePeriod> insurancePeriodList) {
        List<InsurancePeriod> newInsurancePeriods = new ArrayList<>();
        insurancePeriodList
                .forEach(insurancePeriod ->
                        newInsurancePeriods.add(** new InsurancePeriodCreator(insurancePeriod, pensionCase, pensionHandlerParty).createNewIP() ** ));

        insurancePeriodRepository.saveAll(newInsurancePeriods);
    }

}

Я попробовал это, основываясь на другой статье в stackoverflow ......

**
InsurancePeriodCreator insurancePeriodCreator = Mockito.spy(new InsurancePeriodCreator(insurancePeriod, pensionCase, pensionHandlerParty));
        Mockito.when(insurancePeriodCreator.createNewIP()).thenReturn(insurancePeriod)
**
Mockito.when(insurancePeriodRepository.saveAll(ArgumentMatchers.anyList())).thenReturn(insurancePeriods);
        createPensionDecision.createPensionPeriod(pensionCase, pensionHandlerParty);;

, но когда я пытаюсь запустить этот тест, он пытается выполнить метод createNewIP () и выдает и исключение

java.lang.NullPointerException в fi.mandatumlife.epeli.ms.yk.rules.YkService.personAge (YkService.java:200) в fi.mandatumlife.epeli.ms.pensionapplicationservice.core.service.formpensiondecision. InsurancePeriodCreator.createNewIP (InsurancePeriodCreator.java:44)

Ответы [ 2 ]

1 голос
/ 15 октября 2019

извлеките InsurancePeriod создание в другой метод из того же класса и создайте шпиона для InsurancePeriodQueryHelper. Что-то вроде:

insurancePeriodList.forEach(insurancePeriod -> createIP(insurancePeriod, newInsurancePeriods));

и просто издевательский createIP метод. Также лучше использовать forEach без побочных эффектов, например

insurancePeriodList.stream()
                   .map(ip -> createIP(ip, pensionCase, pensionHandlerParty))
                   .collect(toList());
1 голос
/ 15 октября 2019

Вы не можете издеваться над конструкторами с помощью Mockito. Вам нужно будет использовать PowerMock .

Совет: PowerMock не следует использовать в новых проектах, так как он добавляет магию вуду, которую лучше избегать, а такжеНкоси сказал в своем комментарии, что может быть лучше сделать код немного более модульным. Что вы можете сделать, это добавить новый класс Builder / Factory и внедрить этот класс в InsurancePeriodQueryHelper. Класс InsurancePeriodCreator уже звучит как Фабрика (Создатель == Фабрика?). Таким образом, вы можете изменить класс a, но и внедрить его в качестве зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...