Hamcrest匹配器无法匹配布尔类型属性

时间:2016-02-24 03:28:04

标签: java matcher hamcrest

课程A;

public class A {
    Integer value;
    Integer rate;
    Boolean checked;
}

我正在构建这样的自定义匹配器;

Matchers.hasItems(allOf( hasProperty("value", equalTo(value)), hasProperty("rate", equalTo(rate))))

检查A的列表是否包含"value" == value && "rate" == rate

的列表

我遇到的问题是,当我将Boolean类型属性checked作为约束添加到此匹配器时,它总是失败,错误消息为property "checked" is not readable

Matchers.hasItems(allOf( hasProperty("value", equalTo(value)), hasProperty("rate", equalTo(rate)), hasProperty("checked", equalTo(checked))))

它是否以某种方式与布尔类型字段的getter方法有is前缀而不是get,并且可能是Hamcrest未能使用is前缀来获取getter { {1}} boolean类型字段。

另外,我应该补充一点,我无法修改类Boolean的结构,因此我无法使用A类型字段。

1 个答案:

答案 0 :(得分:1)

没有人回答这个问题,但我已经在HasPropertyWithValue方法中使用这个小修改实现了我自己的propertyOn类,其中生成了给定bean和属性名称的PropertyDescriptor。 / p>

private Condition<PropertyDescriptor> propertyOn(T bean, Description mismatch) {
    PropertyDescriptor property = PropertyUtil.getPropertyDescriptor(propertyName, bean);
    if (property != null) {
        if (property.getReadMethod() == null && property.getPropertyType().equals(Boolean.class)) {
            String booleanGetter = "is" propertyName.substring(0, 1).toUpperCase() propertyName.substring(1);
            for(Method method : bean.getClass().getDeclaredMethods()) {
                if (method.getName().equals(booleanGetter)) {
                    try {
                        property.setReadMethod(method);
                    } catch (IntrospectionException e) {
                        throw new IllegalStateException("Cannot set read method" e);
                    }
                }
            }
        }
    } else {
        mismatch.appendText("No property \"" + propertyName + "\"");
        return notMatched();
    }

    return matched(property, mismatch);
}

在创建PropertyDescriptor之后,其中is为null readMethod。我使用Java Reflection来获取以is前缀开头的正确布尔getter方法,并将其作为readMethod添加到属性中。这已经解决了这个问题,但却是如此丑陋。

我还在GitHub中为Hamcrest项目创建了拉取请求; https://github.com/hamcrest/JavaHamcrest/pull/136