Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JUnit测试(java)中,如何使用Assertj库签入数组数组?_Java_Unit Testing_Lambda_Junit_Assertj - Fatal编程技术网

在JUnit测试(java)中,如何使用Assertj库签入数组数组?

在JUnit测试(java)中,如何使用Assertj库签入数组数组?,java,unit-testing,lambda,junit,assertj,Java,Unit Testing,Lambda,Junit,Assertj,我想使用assertj检查数组中包含其他数组的数据 accounts: [class AccountResource { resourceId: 010001781LV bicFi: null accountId: null name: Livret A Rosalie details: LIVRET A linkedAccount: null usage: PRIV

我想使用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
    }
我的两个第一个测试用例都正常。我在“resourceId=010001781LV”上进行筛选,并检查账户。货币=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'和'balancesforeach.balanceType=CLBD'并检查balanceAmount=10000

我在其他lambda中尝试lambda,但我需要一些帮助:

我在第二个过滤器上有以下错误:


如果我是正确的,则以下代码不会返回布尔值:

account.getBalances().forEach(balance -> {
    balance.getBalanceAmount().getAmount().equals("10000");
})
这意味着它不是要在中使用的有效谓词

filteredOn(account -> account.getBalances().forEach(balance -> {
    balance.getBalanceAmount().getAmount().equals("10000");
}))
我相信java试图应用filteredOnCondition,这是不可能的

编辑

如果您的问题是如何过滤帐户中所有等于10000的余额?然后,您可以使用未测试的谓词,但该谓词应足够接近您想要的内容:

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

请参见

要点是filterOn中的表达式应返回boolean,而forEach返回void

账户id应为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);
}

你的答案,不是答案。我明白这是行不通的,否则我就不会问这个问题了。我只是想表明我已经试过了。平面地图没有什么解决方案?抱歉,您的问题不清楚,希望我的编辑能有所帮助。@Ivan Lymar,理解问题并回答谢谢,您的代码帮助了我。我使用以下内容进行测试:assertThathalAccounts.getAccounts.filteredOnaccount->account.getResourceId.Equals1010001781LV.filteredOnaccount->account.getBalances.stream.anyMatchbalance->balance.getBalanceType.EqualBalanceStatus.CLBD.extractingaccount->.getBalances.stream.anyMatchbalance->balance.getBalanceAmount.getAmount.equals1000.containsOnlytrue;。是否可以在ContainesActly中获得对象平衡而不是布尔值?@sgrillon ContainesActly将使用调用它的集合的类型。所以,如果你有一个布尔值列表,你只能和布尔值进行比较。如果您有余额列表,请与余额进行比较。
account -> account.getBalances().stream()
                  .map(balance ->  balance.getBalanceAmount().getAmount())
                  .allMatch(amount -> amount.equals("10000"))
@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);
}