【发布时间】:2017-11-29 19:20:50
【问题描述】:
我有一个场景,我从方法调用中收到一个列表,我想断言该列表包含正确的元素。一种方法是在每个元素中查找一些细节,以查看要与哪个预期元素进行比较 - 例如。一个名字。但是,这些元素还包含一个随机生成的 UUID,我不关心比较。
然后我想一个测试工具可能会来救我。以下面的简化示例为例。
我有一个班狗:
public class Dog {
private String name;
private Integer age;
}
它们包含在一个列表中:
List<Dog> dogs = ... many dogs
现在我想测试该列表是否包含预期的狗,但由于某种原因我不知道某些字段 - 让我们说age。
我已经尝试使用 assertj 和 hamcrest,但我找不到正确的解决方案,既比较两个列表,同时也忽略一些字段。
到目前为止,这就是我所拥有的(使用 hamcrest):
List<Dog> actualDogs = codeUndertest.findDogs(new Owner("Basti"));
List<Dog> expectedDogs = createExpectedListOfDogsWithoutTheAge();
Matcher.assertThat(actualDogs.get(0), Matcher.is(com.shazam.shazamcrest.matcher.Matchers
.sameBeanAs(expectedDogs.(0))
.ignoring("age")
))
这可行,但它只比较 Dog 类的两个对象。如何比较两个列表中的所有狗?
额外的问题:我如何在不知道顺序的情况下比较列表,或者我只需要断言预期的狗包含在列表中。
【问题讨论】:
-
有一个非常酷的 Java 库,可以让您根据给定条件评估对象。我认为这对于这个用例来说是完美的。 github.com/apptreesoftware/Conditional
标签: java unit-testing hamcrest assertj