课程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
类型字段。
答案 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