2017-08-25 75 views
2

我有一個具有兩(2)個屬性的Java自定義對象集合List<Employee>。它是作爲Web服務的響應而收到的。對象好像Hamcrest Pattern斷言2自定義集合的屬性

public class Employee{ 
    public String getName(){ ... } 
    public String getDesignation(){ ... } 
} 

我需要寫一個斷言來檢查員工的名字是大衛然後其名稱必須是經理。我試了一下這樣的

assertThat(employeeList, allOf(hasItem(hasProperty("name", equalTo("David"))) , hasItem(hasProperty("designation", equalTo("Manager")))));

,但它通過如果有至少一個Manager實例和一個大衛。我的要求是在單個實例上應用這兩個檢查。

請幫助。

回答

1

提供類Foo

public class Foo { 
    private String name; 
    private String designation; 

    public Foo(String name, String designation) { 
     this.name = name; 
     this.designation = designation; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDesignation() { 
     return designation; 
    } 

    public void setDesignation(String designation) { 
     this.designation = designation; 
    } 
} 

和一個自定義Hamcrest匹配:

private static class FooMatcher extends BaseMatcher<List<Foo>> { 
    public String name; 
    public String designation; 

    public static FooMatcher matches(String name, String designation) { 
     return new FooMatcher(name, designation); 
    } 

    private FooMatcher(String name, String designation) { 
     this.name = name; 
     this.designation = designation; 
    } 

    @Override 
    public boolean matches(Object item) { 
     Foo foo = (Foo) item; 
     return foo.getName().equals(name) && foo.getDesignation().equals(designation); 
    } 

    @Override 
    public void describeTo(Description description) { 
     // this is a quick impl, you'll probably want to fill this in! 
    } 
} 

此測試將通過:

@Test 
public void canAssertOnMultipleFooAttributes() { 
    List<Foo> incoming = Lists.newArrayList(new Foo("bill", "sir"), new Foo("bob", "mr"), new Foo("joe", "mr")); 
    assertThat(incoming, hasItem(FooMatcher.matches("bob", "mr"))); 
}