Мокито продолжает возвращать пустой список - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю над модульным тестированием метода в Mockito, и mockito продолжает отправлять пустой список нулевого размера, даже когда я инициализировал список, который должен быть возвращен.

Это код для тестирования.Обратите внимание, что nonCashIncludedPaymentPlanActive всегда имеет значение true (Mocked).

    List<DebtAccountTransaction> debtAccountTransactionList = null;

    boolean nonCashIncludedPaymentPlanActive = balancingPlanService.checkNonCashIncludedPaymentPlanParameter(debtAccountId);


    if (nonCashIncludedPaymentPlanActive) {
        debtAccountTransactionList = debtAccountTransactionDao
                .getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null);
    } 
    if (debtAccountTransactionList.isEmpty()) {
        throw new SfcException("DISPLAY.PAYMENT_PLAN_WITH_NO_BALANCE_SERVICE_FILE_CLOSED");
    }

Это утверждение, которое продолжает возвращать список, который я высмеял в mockito, и добавил в него элемент, а здесь он возвращает пустой список.

debtAccountTransactionList = debtAccountTransactionDao
                .getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null);

который затем, конечно, попадает в эту строку

if (debtAccountTransactionList.isEmpty()) {
        throw new SfcException("DISPLAY.PAYMENT_PLAN_WITH_NO_BALANCE_SERVICE_FILE_CLOSED");
    }

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

when(debtAccountTransactionDao.getDebtAccountTransactionListByDebtAccountIdListWithCN(baseDebtIdAccountList, null)).thenReturn(
            debtAccountTransactionList);

и объявлениеdebtAccountTransactionList - это:

DebtAccountTransaction debtAccountTransaction = spy(DebtAccountTransaction.class);
    debtAccountTransaction.setId(2L);


    List<DebtAccountTransaction> debtAccountTransactionList = new ArrayList<DebtAccountTransaction>();
    debtAccountTransactionList.add(debtAccountTransaction);

Я пытался насмехаться над списком, пробовал разные захватчики аргументов, но, похоже, ничего не работает.Когда я отлаживаю его, Mockito действительно заполняет debtAccountTransactionList , но с пустым списком, таким образом, он терпит неудачу.

Любая помощь с тем, как я могу убедиться, что Mockito отправляет непустое непустоеНулевой список, чтобы он мог обойти проверку isEmpty () .

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Проблема в том, что имитация создания / регистрации поведения.Это не соответствует тому, что вы положили в метод, и, следовательно, возвращается к стандартному поведению возврата пустого списка.

, как указано M.Deinum

Таким образом, была проблема с принятием аргумента Mockito, и он игнорировал бы мою заглушку, а затем возвращал пустой список по умолчанию.

Я исправил его, убедившись, чтообъект, который baseDebtIdAccountList передан в функцию когда (debtAccountTransactionDao.getDebtAccountTransactionListByDebtAccountIdListWithCN (baseDebtIdAccountList, null)).Таким образом, в аргументах произошло несоответствие, и Mockito использовал стандартный способ использования пустого списка.

0 голосов
/ 25 сентября 2018

Хорошее правило при написании тестов, особенно с такой насмешливой библиотекой, как Mockito: не путайте заглушки с проверкой.Stubbing (when) - это перевод тестируемой системы (SUT) в нужное состояние, не о , подтверждающее что-либо о том, как ведет себя SUT.

InMockito, способ сделать утверждение о том, как ведет себя SUT, это после запуска SUT, используя verify вызовы.Если у вас нет вызовов verify, вы на самом деле ничего не утверждаете, и ваше SUT может плохо себя вести без теста на его перехват, что, очевидно, плохо.

В результате обычно этоЛучше всего сделать ваши спички для окурков (when) как можно более широкими, поскольку цель окурков - просто убедиться, что вы попали в правильный тестовый набор.Например, вы можете и часто должны использовать такие совпадения, как any() в своем вызове when().Если бы вы сделали это, вы бы обошли проблему, с которой вы столкнулись.

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

0 голосов
/ 25 сентября 2018

Вы поместили в любое место кода что-то вроде:

debtAccountTransactionDao = Mockito.mock(NameOfTheClassOfThisDebtAccountObject.class);

?

Вы должны поместить что-то подобное перед вызовом метода getDebtAccountTransactionListByDebtAccountIdListWithCN, чтобы он знал, что должениспользуйте смоделированное поведение, а не нормальное поведение метода (который может вернуть пустой список).

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