我有一个Entity对象让我们说一个人和一个为CXF生成的JAXB PersonType,我的服务应该返回一个PersonType列表,所以我获得了Person实体列表,然后我把它转换为PersonType。
在我的测试用例中,我创建了一个虚拟的Person对象,用于测试:
Person personOne = new Person();
personOne.setId(10L);
personOne.setName("TestPersonOne");
Person personTwo = new Person();
personTwo.setId(20L);
personTwo.setName("TestPersonTwo);
然后我将它传递给我的业务方法来处理它,期待两个PersonType JAXB对象的列表。
我尝试了很多方法:
首先我尝试使用带有断言的 hamcrest hasItem 匹配器,我将personOne和PersonTwo转换为PersonType对象
List<PersonType> personTypes = personService.getAllPersons(personOne, personTwo);
PersonType personTypeOne = PersonUtility.convertToPeronsType(personOne);
PersonType personTypeTwo = PersonUtility.convertToPeronsType(personTwo);
assertThat(personTypes, hasItem(personTypeOne));
assertThat(personTypes, hasItem(personTypeTwo));
但它没有用,因为它在JAXB对象(PersonType)中使用了equalts()方法,因为它是从模式生成的,所以它没有被覆盖,所以它声明了明显不同的对象引用。我无法控制覆盖equals()方法。
第二次尝试:我试图循环遍历PersonType列表并逐个声明对象。
for (PesonType personType : personTypes) {
assertThat(Long.parseLong(personType.getId().getValue()), anyOf(equalTo(10L), equalTo(20L)));
}
但是这个也不可靠,因为如果我的实现中有一个bug并且它返回PersonType列表,其中personTwo 两次,则断言将通过,因为在每次迭代中anyOf(10L,20L)将是真的。
这是假阳性,我需要每次迭代都不同,所以如果第一次是等于(20L)那么接下来应该是等于(10L)或者它将失败,反之亦然。但这种说法并不能做到这一点。
那么如何通过使每次迭代断言取决于先前的迭代断言来实现此功能?或类似的东西。