【问题标题】:Verify array with custom objects使用自定义对象验证数组
【发布时间】:2014-06-04 08:05:49
【问题描述】:

我有一堂课:

public class MyCustomObject {
    private String field1;
    private String field2;
}

我创建了 MyCustomObject 数组:

MyCustomObject[] array = new MyCustomObject[]{new MyCustomObject()};

我的目标是使用 hamcrest 匹配器验证这个数组的元素。我尝试了以下方法:

assertThat(array, allOf(hasItemInArray(hasProperty("field1", equalTo("value1")))), hasItemInArray(hasProperty("field2", equalTo("value2")))));

但不幸的是它不起作用。

自定义对象数组可以通过何种方式进行验证?

【问题讨论】:

  • 究竟是什么不起作用?你会期待什么?当您说容量时,您是指数组的大小/长度吗?如果是这样,为什么不检查一下?
  • 我无法使用我的自定义对象验证哪些元素包含数组。这个想法是直接使用上面指定的类来验证名称和值字段。
  • 这不是一个好的设计。 hamcrest 和 BDD 的整体理念是测试读起来像规范。这读起来就像您正在检查类元数据,而不是类的功能。
  • 如果您想要验证,请不要使用 hamcrest。使用 if 和 instanceof 检查您的约束,如果不满足则抛出异常。 Hamcrest 和 Junit 用于单元测试,而不是运行时参数验证。
  • 你能澄清一下“它不起作用”吗?编译器错误?假阳性/阴性?在这种情况下(玩具代码),您应该将其拆分为两个断言。

标签: java junit hamcrest


【解决方案1】:

出于测试目的,我会将您的数组更改为 ArrayList

List<MyCustomObject> customObjects = Arrays.asList(array);

如果列表中存在预期的项目,然后使用 Hamcrest hasItems Matcher 进行断言:

assertThat(customObjects, hasItems(myCustomObject1, myCustomObject2));

【讨论】:

    【解决方案2】:

    您是否尝试过在您的课程中添加 getter?这对我有用。

    public class MyCustomObject {
        private String field1;
        private String field2;
    
        public String getField1() {
            return field1;
        }
    
        public String getField2() {
            return field2;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2019-02-03
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多