Der Matcher IsIterableContainingInAnyOrder
zwei Überlastungen für die statische Factory-Methode hat containsInAnyOrder
(beide haben den Rückgabetyp Matcher<java.lang.Iterable<? extends T>>
):Widersprüchliche Überlastungen für hamcrest Matcher
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
containsInAnyOrder(Matcher<? super T>... itemMatchers)
Betrachten wir nun die folgenden Programm:
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import org.junit.Test;
public class SomeTest {
@SuppressWarnings("unchecked")
@Test
public void foo() {
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(equalTo("foo"), equalTo("bar")));
}
}
Wenn dies als JUnit-Test ausgeführt wird, wird es wie erwartet übergeben. Es verwendet die oben gezeigte zweite Überlast von containsInAnyOrder
.
Nun, wenn ich ändern, um die Behauptung zu dieser (was genau das Beispiel in der documentation of the first overload gegeben Spiele):
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(Arrays.asList(equalTo("foo"), equalTo("bar"))));
^^^^^^^^^^^^^^
kompilieren nicht mehr, weil jetzt der Compiler den Rückgabetyp von containsInAnyOrder
folgert zu be
Matcher<Iterable<? extends List<Matcher<String>>>>
Es scheint, als ob der Compiler immer noch die zweite Überladung wählt. Wenn es die erste verwendet, sollte das Beispiel funktionieren. Warum verhält es sich so? Wie kann ich das schaffen?
Ich benutze Hamcrest 1.3 und Oracle Java 1.7.
ich die zweite Version für Typsicherheit empfehlen.Zusätzlich können Sie 'Matcher 'schreiben. containsInAnyOrder' statt 'IsIterableContainingInAnyOrder. enthältInAnyOrder'. –
eee