[英]JUnit - Comparing Arrays of objects
我有一個旨在測試從數據庫返回的對象數組(使用Rule包裝器類的規則集)的內容的測試:
[
{
id: 1,
name: "rule_1",
description: "this rule will check something",
},
]
@Test
public void testQueryRules() throws IOException {
final List<Rule> rules = ruleDB.queryRules();
final String expectedRuleId = "1";
final String expectedName = "rule_1";
final String expectedDescription = "this rule will check something";
final Rule rule = new Rule(expectedRuleId, expectedName, expectedDescription);
final List<Rule> expectedRules = new ArrayList<Rule>();
expectedRules.add(rule);
expectedRules.forEach(expectedRule -> {
System.out.println("RULE ID " + expectedRule.getRuleId());
System.out.println("RULE NAME " + expectedRule.getRuleName());
System.out.println("RULE DESCRIPTION " + expectedRule.getDescription());
});
rules.forEach(actualRule -> {
System.out.println("ACTUAL RULE ID " + actualRule.getRuleId());
System.out.println("ACTUAL RULE NAME " + actualRule.getRuleName());
System.out.println("ACTUAL DESCRIPTION " + actualRule.getDescription());
});
System.out.println("MATCHED " + Arrays.deepEquals(expectedRules.toArray(), rules.toArray()));
System.out.println("MATCHED AGAIN " + Arrays.equals(expectedRules.toArray(), rules.toArray()));
Assert.assertArrayEquals(expectedRules.toArray(), rules.toArray());
}
如您所見,我已經嘗試使用Arrays.equals()
以及Arrays.deepEquals()
和assertArrayEquals()
。 即使預期和實際的輸出都相同,但似乎沒有一個可以成功測試:
預期:
RULE ID: 1
RULE NAME: "rule 1",
RULE DESCRIPTION: "this rule will check something",
實際:
ACTUAL RULE ID: 1
ACTUAL RULE NAME: "rule 1",
ACTUAL RULE DESCRIPTION: "this rule will check something"
用Java測試對象數組的標准方法是什么? 似乎失敗了,因為即使內容相同,指針引用也不同。
您可能要為此使用assertj 。 特別是它的usingFieldByFieldElementComparator
import java.util.Arrays;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
class MyTests {
static class Rule {
final String id;
final String name;
final String description;
Rule(String id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
// no equals, no hashCode
}
@Test
void rulesShouldEqual_whenTheirPropertiesEqual() {
Rule actualRule1 = new Rule("id1", "name1", "description1");
Rule actualRule2 = new Rule("id2", "name2", "description2");
List<Rule> actual = Arrays.asList(actualRule1, actualRule2);
Assertions.assertThat(actual).usingFieldByFieldElementComparator().containsExactly(
new Rule("id1", "name1", "description1"),
new Rule("id2", "name2", "description2"));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.