2016-02-24 5 views
1

Для класса A;Соединитель Hamcrest не подходит для свойства типа Boolean

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

Я создаю пользовательский Matcher, как это;

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

, чтобы проверить, если список A содержит один с "value" == value && "rate" == rate

У меня есть проблема в том, что, когда я включаю свойство checkedBoolean типа как ограничение для этого Matcher, он всегда терпит неудачу с ошибкой. msg property "checked" is not readable.

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

Является ли это каким-то образом связаны с методами геттерных полей логического типа имеют is префикс, а не get, и может быть Hamcrest не использовать is префикс для геттер, если это не boolean но Boolean тип поля.

Кроме того, я должен добавить, что я не могу изменить структуру класса A, поэтому я застрял с полями Boolean.

ответ

1

Никто не ответил на этот вопрос, но я внедрил свой собственный класс HasPropertyWithValue с этой небольшой модификацией в методе propertyOn, где генерируется 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, где имеет нулевую readMethod. Я использовал Java Reflection для получения правильного метода Boolean getter, который начинается с префикса is и добавляет его в свойство как readMethod. Это решило проблему, но так уродливо.

Я также создал запрос на тягу для проекта Hamcrest в GitHub; https://github.com/hamcrest/JavaHamcrest/pull/136