匹配器IsIterableContainingInAnyOrder
对静态工厂方法有两个重载containsInAnyOrder
(都有返回类型Matcher<java.lang.Iterable<? extends T>>
):
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
containsInAnyOrder(Matcher<? super T>... itemMatchers)
现在考虑以下程序:
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")));
}
}
将其作为 JUnit 测试执行时,它按预期通过。它使用containsInAnyOrder
上面显示的第二个重载。
现在,当我将断言更改为此(与第一个重载文档中给出的示例完全匹配)时:
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(Arrays.asList(equalTo("foo"), equalTo("bar"))));
^^^^^^^^^^^^^^
它不再编译,因为现在编译器推断返回类型containsInAnyOrder
为
Matcher<Iterable<? extends List<Matcher<String>>>>
似乎编译器仍然选择第二个重载。如果它使用第一个,该示例应该可以工作。为什么它会这样?我怎样才能使这项工作?
我正在使用 Hamcrest 1.3 和 Oracle Java 1.7。