在 JUnit 测试中 (java) 如何使用 Assertj 库检入数组?
in JUnit test (java) How to check in a array of array with Assertj librairy?
我想使用 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' 和过滤 'balances(foreach).balanceType=CLBD' 并检查 balanceAmount=10000。
我在其他 lambda 中尝试 lambda 但我需要一些帮助:
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) -> {})
如果我是正确的,以下代码不会 return 布尔值(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"))
重点是 filterOn
中的表达式应该 return boolean
而 forEach
returns 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);
}
我想使用 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' 和过滤 'balances(foreach).balanceType=CLBD' 并检查 balanceAmount=10000。
我在其他 lambda 中尝试 lambda 但我需要一些帮助:
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) -> {})
如果我是正确的,以下代码不会 return 布尔值(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"))
重点是 filterOn
中的表达式应该 return boolean
而 forEach
returns 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);
}