当前位置: 首页 > 知识库问答 >
问题:

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

佟英武
2023-03-14

对于类A

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

我正在构建这样的自定义Matcher;

Matchers.has项目(allOf(hasProperty(value, equalTo(value)), hasProperty(price, equalTo(price)))

检查a列表是否包含中“value”==value的列表

我的问题是,当我将Booleantype属性checked作为约束合并到此匹配器时,它总是失败,错误消息为属性“checked”不可读。

匹配器。hasItems(allOf(hasProperty(“value”),equalTo(value)),hasProperty(“rate”,equalTo(rate)),hasProperty(“checked”,equalTo(checked)))

它是否与布尔类型字段的getter方法具有Is前缀而不是get有关,如果它不是boolean类型字段,则可能是Hamcrest无法为getter使用Is前缀。

另外,我应该补充的是,我不能修改类A的结构,因此我只能使用布尔类型字段。


共有1个答案

尉迟卓
2023-03-14

没有人回答这个问题,但我在propertyOn方法中做了一个小小的修改,实现了我自己的HasPropertyWithValue类,其中is生成给定bean和属性名称的PropertyDescriptor

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具有nullreadMethod。我使用Java反射获得正确的布尔getter方法,该方法以is前缀开头,并将其作为readMethod添加到属性中。这解决了这个问题,但方式如此丑陋。

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

 类似资料:
  • 问题所在 我目前正在尝试使用Hamcrest匹配器来断言返回的列表类型是特定类型。例如,假设我的服务调用返回了以下列表: null 使用Hamcrest匹配器,是否有一种方法可以断言空列表是某种类型的参数化的(例如)?

  • 它看起来像hamcrest(尽管看起来,还有更多)。为什么我会选择使用(除了看起来类稍微小一点之外),为什么这两个类如此相似?

  • 问题内容: 如何将整数转换为布尔值? 问题答案: 尝试使用此返回 或仅使用布尔值开始(使用更好的名称): 它继续使我迷惑人们为什么使用-可怕的变量名。看起来并不传达任何意义。

  • 我的问题是:这是一个bug还是我遗漏了什么? 事实上,不同的匹配器以不同的格式返回消息是一个很大的问题,因为我试图编写一些自定义的验证框架,该框架使用匹配器,并且能够在出现任何错误时返回良好的人类可读的消息。我似乎不能为此目的使用方法...

  • 我想在TestNG测试中使用Hamcrest匹配器,特别是软断言。我怎么能这么做?我知道我可以在测试中使用Hamcrest的断言,例如:

  • 错误 线程“main”java.lang.Error:未解决的编译问题:类型不匹配:无法从Scanner转换为boolean类型不匹配:无法在converter.main(converter.java:14)处从int转换为Scanner