2014-11-04 8 views
6

Hamcrest에서 AssertJ로 일부 테스트를 변환하는 중입니다. Hamcrest에서는 다음 스 니펫을 사용합니다.AssertJ에서 하나 또는 둘 다 유지하는지 테스트합니다.

assertThat(list, either(contains(Tags.SWEETS, Tags.HIGH)) 
    .or(contains(Tags.SOUPS, Tags.RED))); 

즉, 목록은 그 중 하나 일 수 있습니다. AssertJ에서 이것을 어떻게 표현할 수 있습니까? anyOf 함수 (물론 중 하나 인중 하나이며 중 하나입니다. 두 번째 질문이됩니다)는 Condition입니다. 나는 그 자신을 구현했지만 이것이 일반적인 경우 인 것처럼 느낀다.

답변

4

아니요, 이것은 Hamcrest가 AssertJ보다 나은 영역입니다.

Set<String> goodTags = newLinkedHashSet("Fine", "Good"); 
Set<String> badTags = newLinkedHashSet("Bad!", "Awful"); 
Set<String> tags = newLinkedHashSet("Fine", "Good", "Ok", "?"); 

// contains is statically imported from ContainsCondition 
// anyOf succeeds if one of the conditions is met (logical 'or') 
assertThat(tags).has(anyOf(contains(goodTags), contains(badTags))); 

이 조건 만들어야합니다 :

import static org.assertj.core.util.Lists.newArrayList;  
import java.util.Collection;  
import org.assertj.core.api.Condition; 

public class ContainsCondition extends Condition<Iterable<String>> { 
    private Collection<String> collection; 

    public ContainsCondition(Iterable<String> values) { 
    super("contains " + values); 
    this.collection = newArrayList(values); 
    } 

    static ContainsCondition contains(Collection<String> set) { 
    return new ContainsCondition(set); 
    } 

    @Override 
    public boolean matches(Iterable<String> actual) { 
    Collection<String> values = newArrayList(actual); 
    for (String string : collection) { 
     if (!values.contains(string)) return false; 
    } 
    return true; 
    }; 
} 

그것은 당신이 기대하는 경우 하나 개의 컬렉션 태그의 존재가 의미하는 것이 무엇인지되지 않을 수도를

다음과 같은 주장을 작성하려면 그들은 다른 하나에 있지 않습니다.

+0

거의 동일한 코드입니다. 조금 번거 롭습니다. 'Condition'은 Hamcrest'Matcher'와 매우 비슷합니다. 차이점은 Hamcrest에는 수십 가지가 포함되어 있다는 것입니다 (Hamcrest의 개념이기 때문에 결국). 또한, Hamcrest matchers는 실제로 매우 다재 다능한데, 그들은 무엇이든 사용할 수 있으며 통과 할 수 있습니다. 그것이 코드 완성을 위해 지불해야하는 가격입니다. 아마도 조건 대신에 햄크 레스터 일치자를 사용할 수있을 것입니다. –

+1

코드가 번거롭다는 것에 동의합니다. Condition 대신 hamcrest matcher를 재사용하도록 생각하고있었습니다. 다른 접근 방식이기 때문에 약간 마지 못해서, 내가 원하는 것을 찾는 사람이 아니라는 것을 알게되었습니다. 네가 좋은 해결책이야. –

2

이 스레드에서 영감을 얻은이 코드는 little repo을 사용하여 결합 할 수 있습니다. 이는 Hamcrest Matcher API를 AssertJ의 Condition API에 적용합니다. 또한 핸디 변환 셸 스크립트가 포함되어 있습니다.

+0

유망 해 보입니다. 나는 그것을 시도 할 것이다. –