我在单元测试中使用junit和hamcrest,我遇到了一个泛型问题:
assertThat(collection, empty());
我知道类型推断不可用,并且其中一个解决方案是提供类型提示,但是在使用静态导入时应该如何键入提示?
答案 0 :(得分:3)
虽然类型推断没有我们想要的那么强大,但在这种情况下,它确实是错误的API。它没有任何理由不必要地限制自己。 is-empty matcher适用于任何集合,而不仅仅适用于特定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();
}
答案 1 :(得分:0)
我不太明白这个问题。这是我使用的方法:
/**
* 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());
这里的仿制药没问题。