【问题标题】:How to use AssertThat to check the property value of objects in a list?如何使用 AssertThat 检查列表中对象的属性值?
【发布时间】:2016-03-22 16:11:43
【问题描述】:

我将使用 asserThat 来验证 ArrayList 中对象的属性。

如果没有一个对象包含要测试的数据,我可以使用 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(), ???);

【问题讨论】:

  • 可以调用列表中的.contains()方法吗?
  • .contains() 方法将检查列表中的对象,但不检查列表中对象的属性

标签: java unit-testing assert hamcrest assertthat


【解决方案1】:

您可以通过以下函数映射到List&lt;String&gt;(使用Java 8 Streams)以提取所有数据字符串

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

然后使用Matchers 中的everyItem/hasItem 函数对生成的字符串列表进行断言:

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

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2019-03-19
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多