2016-02-16 86 views
2

我需要編寫匹配器將檢查多個屬性。對於我用過的單個房產:匹配在一個匹配器多個屬性

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)); 

我如何在一個匹配器中檢查更多屬性?

回答

8

您可以檢查使用一個匹配的匹配器與allOf結合多個屬性:

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

但我想,你實際上是在尋找的是samePropertyValuesAs一個,來檢查,如果一個bean具有相同的屬性值作爲另一個通過檢查屬性本身,而不是equals方法:

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

是,allOf是很好的方式,但我不能使用assertThat 我需要驗證,如果對象run方法與預期的參數,如: '驗證(模擬)。方法(argThat(matcherName));' – Szympek

+0

@Szympek 'samePropertyValuesAs'也是'Matcher'可以分配給一個變量:'匹配器 matcherName = samePropertyValuesAs(expectedBean)' – Ruben

1

Ruben's answer使用allOf是最好的方式結合匹配器,但你也可以選擇基於BaseMatcherTypeSafeMatcher從頭開始寫自己的匹配:

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

雖然你得到無限的權力來寫任意匹配代碼,而不依賴於反射(在該hasProperty做方式),你需要編寫自己的describeTodescribeMismatchSafely)實現,以獲得全面的錯誤消息hasProperty定義和allOf會集結你。

對於涉及幾個簡單匹配器的簡單案例,您可能會發現使用allOf是明智的做法,但如果匹配大量屬性或實現複雜條件邏輯,請考慮編寫自己的代碼。