2016-10-21 3 views
5

나는 Hamcrest 1.3을 사용하고 있으며보다 간결한 방법으로 다음을 달성하려고합니다.hamcrest의 컬렉션에있는 일부 항목의 크기와 존재 여부를 확인하는 방법

는 테스트 케이스 다음 고려 : 여기

@Test 
public void testCase() throws Exception { 

    Collection<String> strings = Arrays.asList(
     "string one", 
     "string two", 
     "string three" 
    ); 

    // variant 1: 
    assertThat(strings, hasSize(greaterThan(2))); 
    assertThat(strings, hasItem(is("string two"))); 

    // variant 2: 
    assertThat(strings, allOf(
     hasSize(greaterThan(2)), 
     hasItem(is("string two")) 
    )); 
} 

목표는 수집의 모두 크기와 일부 특정 항목에 포함시킬 확인하는 것입니다.

첫 번째 변형이 가능하고 받아 들여지는 경우 컬렉션이 그 자체로 다른 작업의 결과 일 수 있으므로 allOf을 사용하여 모든 작업을 수행하는 것이 더 적합하므로 항상 쉽게 수행 할 수있는 것은 아닙니다. 조작. 위의 두 번째 변형에서 수행됩니다. 같은 실제 크기와 단일 샷 작업을 사용 Hamcrest에서 컬렉션의 항목 (대한 테스트의 구체적인 방법을

error: no suitable method found for allOf(Matcher<Collection<? extends Object>>,Matcher<Iterable<? extends String>>) 

있나요 :

그러나 컴파일 타임 오류를 다음 발생합니다 두 번째 변화의 코드를 포함 allOf)?

+0

관련 https://stackoverflow.com/questions/21624592/hamcrest-compare-collections/44030511#44030511 – rvazquezglez

+0

@rvazquezglez가 모두 있다는 점에서 관련 hamcrest와 collections에 관해서는;) 그렇지 않으면 제목을 다시 읽으십시오! – mohamnag

답변

6

저는 컴파일러가 제네릭을 분류 할 수 없다고 생각합니다. 중동 위해 노력하고 다음 (JDK의 8u102) :

assertThat(strings, Matchers.<Collection<String>> allOf(
    hasSize(greaterThan(2)), 
    hasItem(is("string two")) 
)); 
+0

이것은 Hamcrest의 기본적인 가독성 아이디어에서 조금 벗어난 경우에도 실제로 작동합니다. – mohamnag

0

추측 : 기존 matchers를 사용하면 거기에 도착하지 않습니다.

하지만 일을 함께하는 법을 이해하면 자신의 일치하는 사람을 작성하는 데 몇 분 밖에 걸리지 않습니다.

아마 다른 내 answer을 확인하십시오. 여기서 내가 어떻게 자신의 일치자를 작성할 수 있는지에 대한 완전한 예제를 제공한다. 당시에는 15 분이 걸렸습니다. 전에는 주문 제작자를 쓰지 않았습니다.

+0

나는 자신의 matchers를 쓰는 데 문제가 없다. 그러나 이것은 나에게 그렇게하는 것이었다. 나는 그것을하기 위해 어떤 방법으로 존재해야한다고 생각했다. – mohamnag

관련 문제