в тесте JUnit (Java) Как проверить массив массива с помощью библиотеки Assertj? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу использовать assertj для проверки данных в массиве, содержащем другой массив.

accounts: [class AccountResource {
        resourceId: 010001781LV
        bicFi: null
        accountId: null
        name: Livret A Rosalie
        details: LIVRET A
        linkedAccount: null
        usage: PRIV
        cashAccountType: null
        product: LVA
        currency: EUR
        balances: [class BalanceResource {
            name: null
            balanceAmount: class AmountType {
                currency: EUR
                amount: 10000
            }
            balanceType: CLBD
            lastChangeDateTime: null
            referenceDate: 2018-05-31
            lastCommittedTransaction: null
        }, class BalanceResource {
            name: null
            balanceAmount: class AmountType {
                currency: EUR
                amount: 10000
            }
            balanceType: XPCD
            lastChangeDateTime: null
            referenceDate: 2018-05-31
            lastCommittedTransaction: null
        }]
        psuStatus: Account Holder
        links: null
    }

Мои 2 первых тестовых случая в порядке.Я фильтрую по 'resourceId = 010001781LV' и проверяю account.currency = EUR.Я фильтрую по 'resourceId = 010001781LV' и проверяю account.balances.size () = 2.

assertThat(halAccounts.getAccounts())
        .filteredOn(account -> account.getResourceId().equals("010001781LV"))
        .extracting(account -> account.getCurrency())
        .containsExactly("EUR");
assertThat(halAccounts.getAccounts())
        .filteredOn(account -> account.getResourceId().equals("010001781LV"))
        .extracting(account -> account.getBalances().size())
        .containsExactly(2);

, но хочу фильтровать по 'resourceId = 010001781LV' и фильтровать по сальдо (foreach) .balanceType= CLBD 'и проверьте balanceAmount = 10000.

Я пытаюсь лямбда в другой лямбде , но мне нужна помощь :

assertThat(halAccounts.getAccounts())
    .filteredOn(account -> account.getResourceId().equals("010001781LV"))
    .filteredOn(account -> account.getBalances().forEach(balance -> {
        balance.getBalanceAmount().getAmount().equals("10000");
    }))
    .extracting(balance -> balance.getBalanceAmount().getAmount())
    .contains("1000");

У меня эта ошибка на 2-м filteredOn:

Multiple markers at this line
    - The target type of this expression must be a functional interface
    - The method filteredOn(Condition<? super AccountResource>) in the type AbstractIterableAssert<ListAssert<AccountResource>,List<? 
     extends AccountResource>,AccountResource,ObjectAssert<AccountResource>> is not applicable for the arguments ((<no type> account) -> {})

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Дело в том, что выражение внутри filterOn должно возвращать boolean, тогда как forEach возвращает void.

Идентификатор счета должен быть "DEF", а все балансы "A" должны иметь "10"значение.

@Test
void test() {
    Account wrongAcc = new Account("ABC", Collections.emptyList());
    Account goodAcc = new Account("DEF", Arrays.asList(
            new Balance("A", "10"),
            new Balance("A", "10"),
            new Balance("B", "20")
    ));
    Account wrongBalanceAcc = new Account("DEF", Arrays.asList(
            new Balance("A", "10"),
            new Balance("A", "20"),
            new Balance("B", "20")
    ));

    List<Account> accountList = Arrays.asList(wrongAcc, goodAcc, wrongBalanceAcc);

    assertThat(accountList)
            .filteredOn(acc -> acc.getId().equals("DEF"))
            .filteredOn(acc ->
                    acc.getBalances()
                            .stream()
                            .noneMatch(balance -> balance.getType().equals("A") && !balance.getAmount().equals("10"))
            ).containsExactly(goodAcc);
}
0 голосов
/ 01 июня 2018

Если я прав, следующий код не возвращает логическое значение ( forEach не возвращает):

account.getBalances().forEach(balance -> {
    balance.getBalanceAmount().getAmount().equals("10000");
})

, что означает, что это недопустимое значение Predicate для использованияв

filteredOn(account -> account.getBalances().forEach(balance -> {
    balance.getBalanceAmount().getAmount().equals("10000");
}))

Я полагаю, что Java пытается применить filteredOn(Condition), что невозможно.

Редактировать

Если ваш вопрос, как мнефильтровать аккаунт havinn all их остатки на сумму 10000?тогда вы можете использовать это Predicate (не проверено, но должно быть достаточно близко к тому, что вы хотите):

account -> account.getBalances().stream()
                  .map(balance ->  balance.getBalanceAmount().getAmount())
                  .allMatch(amount -> amount.equals("10000"))

См. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#allMatch-java.util.function.Predicate-

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