我正在学习Hamcrest 1.3,我想在Matchers中为每个Hamcrest静态方法提供一个例子.Javadoc已经有了一些方法的例子.我测试了以下包含 Java 8的代码片段,它通过了:
assertThat(Arrays.asList("foo", "bar"),
contains(Arrays.asList(equalTo("foo"), equalTo("bar"))));
Run Code Online (Sandbox Code Playgroud)
但是,我的团队目前正在使用Java 7,所以我想确保所有示例都适用于该版本.上面的代码片段在Java 7中产生以下错误:
没有为assertThat找到合适的方法(java.util.List,org.hamcrest.Matcher >>>)方法org.junit.Assert.assertThat(T,org.hamcrest.Matcher)不适用(实际参数org.hamcrest.Matcher >>>无法转换为org.hamcrest.Matcher>通过方法调用转换)方法org.junit.Assert.assertThat(java.lang.String,T,org.hamcrest.Matcher)不适用(无法从参数实例化,因为实际和正式的参数列表长度不同)
我知道Java 8为静态方法添加了新的隐式类型功能,我认为这可能是相关的.我试图重构参数并将它们转换为预期的参数,但这会导致相同的错误:
List<String> actual = Arrays.asList("foo", "bar");
List<Matcher<String>> expected = Arrays.asList(equalTo("foo"),
equalTo("bar"));
assertThat(actual, contains(expected));
Run Code Online (Sandbox Code Playgroud)
static <E> Matcher<java.lang.Iterable<? extends E>> contains(java.util.List<Matcher<? super E>> itemMatchers)在Java 7中调用的正确方法是什么?
Mue*_*uel 10
在Hamcrest Javadoc中,contains()您要定位的方法签名是:
public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers);
Run Code Online (Sandbox Code Playgroud)
上面签名中要注意的重要一点是List<Matcher<? super E>>.Java 7无法推断List<Matcher<? super E>>出来List<Matcher<String>>.所述contains()附加过载,所以该方法的签名Java 7的目标是:
public static <E> Matcher<Iterable<? extends E>> contains(E... items);
Run Code Online (Sandbox Code Playgroud)
这就是你得到神秘编译错误信息的原因!
幸运的是,修复非常简单:
List<String> actual = Arrays.asList("foo", "bar");
List<Matcher<? super String>> expected = Arrays.<Matcher<? super String>>asList(equalTo("foo"),
equalTo("bar"));
assertThat(actual, contains(expected));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3586 次 |
| 最近记录: |