2014-11-04 7 views
6

Ich bin dabei, einige Tests von Hamcrest zu AssertJ zu konvertieren. In Hamcrest verwende ich das folgende Schnipsel:Test, dass entweder eine Sache oder eine andere in AssertJ

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

Das heißt, die Liste kann entweder das oder das sein. Wie kann ich das in AssertJ ausdrücken? Die anyOf Funktion (natürlich beliebig ist etwas anderes als entweder, aber das wäre eine zweite Frage) dauert eine Condition; Ich habe das selbst umgesetzt, aber es fühlt sich so an, als ob dies ein allgemeiner Fall wäre.

Antwort

4

Nein, das ist ein Bereich, in dem Hamcrest besser ist als AssertJ.

die folgende Behauptung schreiben:

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

Sie diese Bedingung erstellen müssen:

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

Es ist vielleicht nicht das, was Sie, wenn Sie die Anwesenheit Ihrer Tags in einer Sammlung erwarten, dass impliziert Sie sind nicht in dem anderen.

+0

Das ist fast der gleiche Code, den ich verwendet habe. Es ist ein bisschen umständlich. Der "Zustand" ist dem Hamcrest "Matcher" sehr ähnlich; der Unterschied ist, dass Hamcrest mit Dutzenden von ihnen kommt (denn das ist schließlich Hamcrests Konzept). Außerdem sind die Hamcrest-Matcher wirklich sehr vielseitig, sie können für alles verwendet werden und können herumgereicht werden. Das ist der Preis, den Sie für die Code-Vervollständigung bezahlen müssen. Vielleicht wäre es möglich, einen Hamcrest Matcher anstelle eines Zustandes zu verwenden? –

+1

Ich stimme zu, der Code ist umständlich. Ich habe darüber nachgedacht, hamcrest matcher anstelle von Condition wiederzuverwenden, ich bin etwas zurückhaltend, weil es ein anderer Ansatz ist, von dem ich kein großer Fan bin, da ich Schwierigkeiten habe herauszufinden, was der richtige macta ist Ihnen ist es eine gute Lösung. –

2

Inspiriert von diesem Thema, möchten Sie vielleicht diese little repo ich zusammen, die die Hamcrest Matcher API in AssertJ Condition API passt verwenden. Enthält auch ein Hand-Dandy-Conversion-Shell-Skript.

+0

Das sieht vielversprechend aus. Ich werde es versuchen. –