2016-03-22 54 views
1

我将使用asserThat来验证ArrayList中对象的属性。如何使用AssertThat检查列表中对象的属性值?

我能够使用assertThat如果没有任何对象包含要测试的数据,但我无法计算如何使用assertThat如果只有一个对象包含要测试的数据。

示例代码:

public class dataNeeded { 
    String data; 
    String modifiedDate; 

    public String getData(){ 
     return data; 
    } 
    ...... 
} 

public ArrayList<dataNeeded> returnsNeededData(){ 
... 
} 

List<dataNeeded> dataToBeTested = returnsNeededData(); 
dataToBeTested.forEach(data->assertThat(data.getData(), not(equalTo("No")))); 

List<dataNeeded> dataToBeTested2 = returnsNeededData(); 
// I need to verify if one of the objects in this list has it's data as "No" 
dataToBeTested.forEach(data->assertThat(data.getData(), ???); 
+0

你可以调用列表上的.contains()方法吗? – JustinKSU

+0

。列表中的.contains()方法将检查对象,但不检查列表中对象的属性 –

回答

1

您可以通过下面的函数映射到List<String>(使用Java 8流)中提取的所有数据串

private List<String> mapToDataStrings(List<dataNeeded> neededData) { 
    return neededData.stream() 
      .map(dataNeeded -> dataNeeded.getData()) 
      .collect(toList()); 
} 

,然后使用everyItem/hasItem函数Matchers在结果字符串列表上作出断言:

List<String> dataToBeTested = mapToDataStrings(returnsNeededData()); 
assertThat(dataToBeTested, everyItem(not("No"))); 

List<String> dataToBeTested2 = mapToDataStrings(returnsNeededData()); 
assertThat(dataToBeTested2, hasItem("No")); 

使用everyItem您可以声明列表中的每个元素都不是“否”,并且hasItem声明列表中至少有一个值为“No”的元素。


或者,您可以实施feature matcher以避免映射功能。

相关问题