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

Возвращение метода "ContractService" является возвращаемым значением метода "checkPgwContract". Я уже высмеиваю класс ContractService и класс ContractServiceManager, но метод checkPgwContract всегда проходил в моем модульном тесте.

ContractServiceImpl

@Override
public List getListOfContractBy(String contractNo) {
List<OasysContract> oasysContractList = oasysContractRepository.findByContractNumber(contractNo);
if (!oasysContractList.isEmpty()) {
        return oasysContractList;
    } else {
        List<Contract> pgwContractList = contractRepository.findContractsByContractNumber(contractNo);
        if (!pgwContractList.isEmpty()) {
            return contractServiceManager.checkPgwContract(pgwContractList);
        }
    }
    return new ArrayList();
}

ContractServiceManagerImpl

private boolean checkHCP(String contractNumber) {
    return contractRepository.findContractByExpiredDate(contractNumber) != null ? true : false;
}

private String checkIsFullyPaid(String contractNumber) {
    return contractRepository.getFullyPaid(contractNumber);
}

@Override
public List<Contract> checkPgwContract(List<Contract> contractList) {
    for (Contract contract : contractList) {
        //check paymentType
        if (contract.getPaymentType() != null &&
                contract.getPaymentType().equals(PAYMENT_TYPE_HCP)) {
            if (checkHCP(contract.getContractNumber())) {
                //check isFullyPaid
                if (checkIsFullyPaid(contract.getContractNumber()).equals(FLAG_YES)) {
                    return new ArrayList<>();
                }
            } else {
                return new ArrayList<>();
            }
        }
    }
    return contractList;
}

UnitTest

@InjectMocks
@Spy
private ContractServiceImpl service;

@Mock
ContractRepository contractRepository;

@Mock
OasysContractRepository oasysContractRepository;

@Mock
ContractServiceManager serviceManager;


public static final String contractNumber = "3900006835";

@Test
public void getListOfContractBy_hcp_success() {
    List<OasysContract> oasysContractList = new ArrayList<>();
    oasysContractList.isEmpty();

    List<Contract> contractList = new ArrayList<>();
    contractList.add(BuildUtil.buildContract());

    //mock
    Mockito.doReturn(oasysContractList).when(oasysContractRepository).findByContractNumber(contractNumber);
    Mockito.doReturn(BuildUtil.buildContractList()).when(contractRepository).findContractsByContractNumber(contractNumber);
    Mockito.doReturn(contractList).when(serviceManager).checkPgwContract(contractList);
    Mockito.doReturn(BuildUtil.buildContract()).when(contractRepository).findContractByExpiredDate(contractNumber);
    Mockito.doReturn("N").when(contractRepository).getFullyPaid(contractNumber);


    //test
    List<Contract> contracts = service.getListOfContractBy(contractNumber);

    System.out.println(contracts);

    assert(!contracts.isEmpty());
}

Теперь значение параметра контрактов пусто. Должен быть возвращен contractList. Я думаю, потому что макет метода checkPgwContract игнорируется.

Мой тест все равно будет проходить, что, очевидно, неправильно, так как мне это проверить?

1 Ответ

0 голосов
/ 24 октября 2019

Эта строка не имеет смысла для меня: Mockito.doReturn(contractList).when(serviceManager).checkPgwContract(contractList);

Ваш метод checkPgwContract() не будет вызываться с параметром contractList, поэтому он не будет вызывать doReturn из Mockito. Он будет вызываться с тем, что BuildUtil.buildContractList() возвращает в вашей строке выше: Mockito.doReturn(BuildUtil.buildContractList()).when(contractRepository).findContractsByContractNumber(contractNumber);

...