我在单元测试中使用带有 hamcrest 的 junit,但遇到了一个泛型问题:
assertThat(collection, empty());
我知道无法通过这种方式进行类型推断,并且其中一种解决方案是提供类型提示,但是在使用静态导入时我应该如何输入提示?
我在单元测试中使用带有 hamcrest 的 junit,但遇到了一个泛型问题:
assertThat(collection, empty());
我知道无法通过这种方式进行类型推断,并且其中一种解决方案是提供类型提示,但是在使用静态导入时我应该如何输入提示?
虽然类型推断没有我们希望的那么强大,但在这种情况下,确实是 API 有问题。它没有充分的理由不必要地限制自己。is-empty 匹配器适用于任何集合,而不仅仅是特定的集合E
。
假设 API 是这样设计的
public class IsEmptyCollection implements Matcher<Collection<?>>
{
public static Matcher<Collection<?>> empty()
{
return new IsEmptyCollection();
}
}
然后assertThat(list, empty())
按预期工作。
您可以尝试说服作者更改 API。同时你可以有一个包装
@SuppressWarnings("unchecked")
public static Matcher<Collection<?>> my_empty()
{
return (Matcher<Collection<?>>)IsEmptyCollection.empty();
}
我不太明白这个问题。这是我使用的方法:
/**
* A matcher that returns true if the supplied {@link Iterable} is empty.
*/
public static Matcher<Iterable<?>> isEmpty() {
return new TypeSafeMatcher<Iterable<?>>() {
@Override
public void describeTo(final Description description) {
description.appendText("empty");
}
@Override
public boolean matchesSafely(final Iterable<?> item) {
return item != null && !item.iterator().hasNext();
}
};
}
我像这样使用它:
List<String> list = new ArrayList<String>();
assertThat(list, isEmpty());
这里的泛型没有问题。