每次迭代都会断言不同的值

时间:2014-12-31 17:34:55

标签: java junit

我有一个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)或者它将失败,反之亦然。但这种说法并不能做到这一点。

那么如何通过使每次迭代断言取决于先前的迭代断言来实现此功能?或类似的东西。

0 个答案:

没有答案