2016-02-16 1 views
2

Мне нужно написать Matcher, который будет проверять несколько свойств. Для одного объекта, который я использовал:Согласование нескольких свойств в одном Matcher

import static org.hamcrest.Matchers.equalTo; 
import static org.hamcrest.Matchers.hasProperty; 
import org.hamcrest.Matcher; 
import org.hamcrest.Matchers; 

    Matcher<Class> matcherName = Matchers.<Class> hasProperty("propertyName",equalTo(expectedValue)); 

Как я могу проверить дополнительные свойства в одном Matcher?

ответ

8

Вы можете проверить больше свойств, используя один Искатель путем объединения matchers с allOf:

Matcher<Class> matcherName = allOf(
     hasProperty("propertyName", equalTo(expected1)), 
     hasProperty("propertyName2", equalTo(expected2))); 

Но я думаю, что то, что вы на самом деле ищете это samePropertyValuesAs один, который проверяет, является ли фасоль обладает тем же свойством ценности, как другой, проверяя самого свойства вместо того equals метод:

assertThat(yourBean, samePropertyValuesAs(expectedBean)); 
+0

Да, allOf хороший способ, но я не могу использовать assertThat мне нужно проверить, если метод объекта выполнения с ожидаемым параметром, как: 'проверить (макет) .method (argThat (matcherName));' – Szympek

+0

@Szympek 'samePropertyValuesAs' также является' Matcher', который вы можете назначить переменной: 'Matcher matcherName = samePropertyValuesAs (expectedBean)' – Ruben

1

Ruben's answer использованием allOf является лучшим способом объединить matchers, но вы также можете написать свой собственный Искатель с нуля на основе BaseMatcher или TypeSafeMatcher:

Matcher<Class> matcherName = new TypeSafeMatcher<Class>() { 
    @Override public boolean matchesSafely(Class object) { 
    return expected1.equals(object.getPropertyName()) 
     && expected2.equals(object.getPropertyName2()); 
    } 
}; 

Хотя вы получаете неограниченную власть, чтобы написать произвольный код Сличителя, не полагаясь на отражении (кстати, что hasProperty делает), вам нужно будет написать свои собственные версии describeTo и describeMismatch (Safely), чтобы получить исчерпывающие сообщения об ошибках, которые hasProperty определяет и что allOf будет собирать для вас.

Возможно, вам будет полезно использовать allOf для простых случаев, связанных с несколькими простыми помощниками, но подумайте о том, чтобы написать свое собственное, если оно соответствует большому количеству свойств или при реализации сложной условной логики.

Смежные вопросы